题目描述
给定一种规律 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
提示:
- 1 <= pattern.length <= 300
- pattern 只包含小写英文字母
- 1 <= s.length <= 3000
- s 只包含小写英文字母和 ’ ’
- s 不包含 任何前导或尾随对空格
- s 中每个单词都被 单个空格 分隔
解题思路
C++利用哈希表实现双映射,也就是说将字符串 pattern 中的元素和 str 中的单词,分别交换作为关键字和值存到哈希表中,然后就得到两个哈希表(A和B),再进行比较过程,在比较的过程中进行判断,若当前的键出现过,但值不相同就返回 0。读者一时不理解,可以手动在纸上模拟下述两个示例的比较过程。
思路
for(int i=0;i<pattern.length();i++)
{
if( A.find( s中第i的单词 )!=A.end() && pattern中第i的字母!=A[ s中第i的单词 ])//find函数判断键是否存在
return 0;
if( B.find(pattern中第i的字母)!=B.end() && s中第i的单词!=B[ pattern中第i的字母 ])
return 0;
}
示例1
哈希表A
key | a | b | b | a |
---|---|---|---|---|
value | dog | cat | cat | dog |
哈希表B
key | dog | cat | cat | dog |
---|---|---|---|---|
value | a | b | b | a |
示例3
哈希表A
key | a | a | a | a |
---|---|---|---|---|
value | dog | cat | cat | dog |
哈希表B
key | dog | cat | cat | dog |
---|---|---|---|---|
value | a | a | a | a |
代码如下:
//单词规律
bool wordPattern(string pattern, string s) {
unordered_map<string,char>HashStr;
unordered_map<char,string>Hashpattern;
vector<string> ans;//存储字符串 s 中的单词
string str="";
for(int i=0;i<s.length();i++){
if(s[i]!=' ')
str+=s[i];
else{
ans.push_back(str);
str="";
}
}
ans.push_back(str); //此时ans中的元素 就是s中的单词
if(pattern.length()!=ans.size())//判断个数是否匹配
return 0;
for(int i=0;i<pattern.length();i++)//将两个字符串的元素交换分别作为键和值 插入到哈希表中
{
HashStr[ans[i]]=pattern[i];
Hashpattern[pattern[i]]=ans[i];
}
for(int i=0;i<pattern.length();i++)//精髓所在
{
if(HashStr.find(ans[i])!=HashStr.end()&&pattern[i]!=HashStr[ans[i]])//find函数查询是否存在
return 0;
if(Hashpattern.find(pattern[i])!=Hashpattern.end()&&ans[i]!=Hashpattern[pattern[i]])
return 0;
}
return 1;
}
本题主要考验哈希表的操作,读者可以好好练习练习。