给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。
这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式。
示例1:
输入: pattern = “abba”, str = “dog cat cat dog”
输出: true
示例 2:
输入:pattern = “abba”, str = “dog cat cat fish”
输出: false
示例 3:
输入: pattern = “aaaa”, str = “dog cat cat dog”
输出: false
示例 4:
输入: pattern = “abba”, str = “dog dog dog dog”
输出: false
思路:首先将给的pattern变成字母,将str以空格分开,首先判断str和pattern的长度是否一致,不一致直接返回false即可,否则进行循环,用的是键值对,如果没有键那么需要判断有没有对应的值,因为可能会出现这种情况,比如:aa和a b,这种情况需要排除的,因此需要判断的是,其实也能用数组来实现,这里就不再
我的代码:
public boolean wordPattern(String pattern, String str) {
String []s = str.split(" ");
Map<Character, String> ha = new HashMap<>();
if(s.length != pattern.length()){
return false;
}
for (int i = 0; i < pattern.length(); i++) {
if(ha.get(pattern.charAt(i)) == null){
if(ha.containsValue(s[i])){
return false;
}
ha.put(pattern.charAt(i), s[i]);
}else {
if(ha.get(pattern.charAt(i)).equals(s[i])){
;
}else {
return false;
}
}
}
return true;
}
这个就是用字符串数组来实现
class Solution {
public boolean wordPattern(String pattern, String str) {
char[] pc = pattern.toCharArray();
String[] words = str.split(" ");
//长度不等
if (pc.length != words.length) {
return false;
}
//以ascii码作为下标存储String。也可以String[] mark = new String[26];只要下面mark[pc[i]-97]即可
String[] mark = new String[123];
for (int i = 0; i < pc.length ; i++) {
if (mark[pc[i]] == null) {
mark[pc[i]] = words[i];
}
//已有值,但与之前存储的不同,所以格式错误
else if (!mark[pc[i]].equals(words[i])) {
return false;
}
}
//判断mark数组中是否有重复值,有重复也表示格式不对
// //方法1:利用hashSet
// HashSet<String> set = new HashSet<>();
// for (int i = 97; i < 123; i++){
// //add结果为false代表有重复
// if (mark[i] != null && (!set.add(mark[i]))) {
// return false;
// }
// }
//方法2:遍历两次
for (int i = 97; i < 122; i++){
for (int j = i + 1; j < 123; j++) {
if (mark[i] != null && mark[i].equals(mark[j])) {
return false;
}
}
}
return true;
}
}