给定一种规律 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 包含了由单个空格分隔的小写字母。
基本思路:该题题意有点模糊,实际上指的是pattern字符的集合和str单词的集合满足双射关系,即任何一个pattern中的字符,都有唯一一个str中的单词与之对应,反之亦然
- 使用两个哈希表来检查a->b,以及b->a的映射,是否满足单射
bool wordPattern(string pattern, string s) {
unordered_map<char,string> dict;
unordered_map<string,char> dict2;
string tmp;
stringstream ss(s);
for(char &ch:pattern){
ss>>tmp;
if(tmp.empty()||(dict.count(ch)==1&&dict[ch]!=tmp)||(dict2.count(tmp)&&dict2[tmp]!=ch))
return false;
dict[ch]=tmp;
dict2[tmp]=ch;
}
return (ss>>tmp)?false:true;
- 将pattern里的字符映射到数字上,str里的单词也映射到数字上,观察是否相等
def wordPattern(self, pattern: str, s: str) -> bool:
res=s.split()
return list(map(pattern.index,pattern))==list(map(res.index,res))