leecode209:单词规律
题目内容
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = “abba”, str = “dog cat cat dog”
输出: true示例 2:
输入:pattern = “abba”, str = “dog cat cat fish”
输出: false
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XIgGXthq-1594830019630)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200715174842214.png)]
不匹配的情况:
- pattern和str组数不同eg:abb与dog cat cat dog
- pattern对应相同,str对应不同
- pattern对应不同,str对应相同
我的解法
使用到的java知识
字符串a不能通过下标访问,如需通过下标访问解决办法2种
- 提取为字符:a.charAt(2)
提取为字符串:a.substring(2, 3)
数组长度.length,字符串.length()
java分割字符串:split函数:此处以空格分割即可
class Solution {
public boolean wordPattern(String pattern, String str) {
//分割样式字符串
//分割str字符串?或者通过下标访问
//对比:默认true,不满足则置为false
//暴力枚举:
String strSplit[]=str.split(" ");
if(pattern.length()!=strSplit.length
)
return false;
for(int i=0;i<pattern.length();i++)
{
for(int j=i+1;j<pattern.length();j++)
{
if(pattern.charAt(i)==pattern.charAt(j))//pattern.[i].equals(pattern[j])报错显示,需要数组而类型是字符串
{
if(!strSplit[i].equals(strSplit[j]))
return false;
}
else
{
if(strSplit[i].equals(strSplit[j]))
return false;
}
}
}
return true;
}
}
模范题解
题解一:hashmap
java+hashMap 这道题说的是对应关系,那首先想到的集合就是Map,将key(a)-value(dog)存在一起,每当遇到一个字母就去查看对应的单词。 失败有两种情况: 1.key存在,经过查找字母对应的单词和这个单词不匹配; 2.key不存在,但是这个单词已经被存了
public static boolean wordPattern(String pattern, String str) {
if(pattern == null || str==null) return false;
String[] string = str.split(" ");
if(pattern.length() != string.length) return false;
HashMap<Character,String> map = new HashMap<>();
for(int i=0; i<pattern.length(); i++){
char tmp = pattern.charAt(i);
//parttern的单个值作为键,str的一个单词为值遍历插入HashMap
//key已经在
if(map.containsKey(tmp)){
//不对应就失败
if(!map.get(tmp).equals(string[i])) return false;
}
//key不存在
else{
//两个value的值一样 a-dog b-dog->false:对应我暴力枚举的pattern不同,str相同
if (map.containsValue(string[i])) return false;
else
//添加k-v值
map.put(tmp,string[i]);
}
}
return true;
}
题解2;法一:hashmap及优化;法二:映射
(涉及映射集合,暂时不看,继续刷题)