1.题目
给定一种规律 pattern
和一个字符串 s
,判断 s
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 s
中的每个非空单词之间存在着双向连接的对应规律。
2.示例
pattern="abba"
s = "cat dog dog cat"
返回 true
pattern="abba"
s = "cat pig dog cat"
返回 false
pattern="ab"
s = "cat cat"
返回 false
提示
1 <= pattern.length <= 300
pattern
只包含小写英文字母1 <= s.length <= 3000
s
只包含小写英文字母和' '
s
不包含 任何前导或尾随对空格s
中每个单词都被 单个空格 分隔
3.思路
哈希表:
首先看到映射相关问题就得联想到哈希表,然后先分析特殊情况,比如s为空或者s里面的字母个数和pattern的个数不匹配则直接返回false,否则正常情况下,先将s通过spilt方法进行切割后,在遍历s情况下,不存在的键值对应的映射就存入哈希表中,存在的就比较是否相等即可。
如果不了解哈希表则可以通过以下内容了解相关知识
4.代码
LeetCode代码:
使用时间优先代码:
class Solution { public boolean wordPattern(String pattern, String s) { // 判断两种特殊情况 if (s.length() ==0){ return false; } String ss[] = s.split(" "); if (ss.length != pattern.length()){ return false; } // 正常情况 HashMap<Character,String> map = new HashMap<>(); for (int i= 0;i<pattern.length();i++){ if (!map.containsKey(pattern.charAt(i))){ if (map.containsValue(ss[i])){ return false; } map.put(pattern.charAt(i),ss[i]); }else { if (!map.get(pattern.charAt(i)).equals(ss[i])){ return false; } } } return true; } }
编辑 还有一种做法是通过构造两个哈希表实现,内存上稍微会优于该算法,但是时间上会慢一些。
案例详细代码:
package LeetCode14; import java.util.Arrays; import java.util.HashMap; public class javaDemo { public static void main(String[] args) { String pattern = "abbc"; String s = ""; boolean flag = true; // 判断两种特殊情况 // 当s为空 if (s.length() ==0){ flag = false; } // 当ss中单词个数与pattern个数不匹配情况 String ss[] = s.split(" "); if (ss.length != pattern.length()){ flag = false; } // 正常情况 HashMap<Character,String> map = new HashMap<>(); // 遍历整个pattern for (int i= 0;i<pattern.length();i++){ // 判断是否存在键值 if (!map.containsKey(pattern.charAt(i))){ // 判断值是否已经对应其他键值 if (map.containsValue(ss[i])){ flag = false; break; } // 不满足前面条件的话就正常放入 map.put(pattern.charAt(i),ss[i]); }else { // 如果有存在的键,则进行比较 if (!map.get(pattern.charAt(i)).equals(ss[i])){ flag = false; break; } } } // 输出flag System.out.println(flag); } }