一.解法
https://leetcode-cn.com/problems/word-pattern/
要点:hashmap
Python,C++,Java都用了相同的哈希表法。
用hashmap对vector<string>arr和string pattern进行来回两次哈希映射(string映射char以及char映射string),如果都没问题说明单词规律一样。
注意:需要用到split函数,C++中没有split函数需要自己手动写。
二.Python实现
class Solution:
def wordPattern(self, pattern: str, str: str) -> bool:
mp={}
pm={}
wordList=str.split(' ')
if len(pattern)!=len(wordList):
return False
for i in range(len(pattern)):
if pm.get(pattern[i]):
if pm[pattern[i]]!=wordList[i]:
return False
else:
pm[pattern[i]]=wordList[i]
if mp.get(wordList[i]):
if mp[wordList[i]]!=pattern[i]:
return False
else:
mp[wordList[i]]=pattern[i]
return True
三.C++实现
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<char,string> mp;
unordered_map<string,char> pm;
int j=0;
vector<string>arr;
for(int i=0;i<str.size();++i){
if(i==str.size()-1){
arr.push_back(str.substr(j,str.size()-j));
}
if(str[i]==' '){
arr.push_back(str.substr(j,i-j));
j=i+1;
}
}
if(pattern.size()!=arr.size()) return false;
int length=pattern.size();
for(int i=0;i<length;i++){
if(mp.find(pattern[i])!=mp.end()&&mp[pattern[i]]!=arr[i]) return false;
if(pm.find(arr[i])!=pm.end()&&pm[arr[i]]!=pattern[i]) return false;
mp[pattern[i]]=arr[i];
pm[arr[i]]=pattern[i];
}
return true;
}
};
四.java实现
class Solution {
public boolean wordPattern(String pattern, String str) {
Map<Character, String> map = new HashMap<Character, String>();
Map<String, Character> map2 = new HashMap<String, Character>();
String[] strs = str.split(" ");
char[] cs = pattern.toCharArray();
if(cs.length != strs.length) return false;
for(int i = 0; i < cs.length;i++){
if(map.containsKey(cs[i])){
if(!map.get(cs[i]).equals(strs[i])) return false;
}
else{ map.put(cs[i],strs[i]);}
if(map2.containsKey(strs[i])){
if(!map2.get(strs[i]).equals(cs[i])) return false;
}
else{map2.put(strs[i],cs[i]);}
}
return true;
}
}