一、运行结果
二、题目
给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-pattern
三、思路
用两个哈希表分别保存两个方向的映射关系,mp保存pattern到s 的映射关系,mp2保存s到pattern的映射关系,pattern每向后取一个字符,就从s中取出一个单词,如果所有pattern相同的字符映射到s中都是相同的单词,并且s中所有相同的单词映射到pattern中都是相同的字符,则为true,否则为false。
四、代码
class Solution {
public:
bool wordPattern(string pattern, string s) {
int lenp = pattern.size();
int lens = s.size();
unordered_map<char, string> mp; //从pattern到s的映射
unordered_map<string, char> mp2; //从s到pattern的映射
int i = 0, j = 0; //i作为遍历s的索引,j作为遍历pattern的索引
while(i < lens){ //将单词串转换为单词数组
if(j >= lenp) return false; //pattern串已经扫描完
string tmp = "";
while(s[i] == ' ' && i < lens) i++; //去掉前导空格
while(s[i] != ' ' && i < lens){ //取出当前单词
tmp += s[i];
i++;
}
if(mp.count(pattern[j]) && mp[pattern[j]] != tmp){ //查找当前映射和之前的映射是否相同
return false;
}
if(mp2.count(tmp) && mp2[tmp] != pattern[j]){
return false;
}
mp[pattern[j]] = tmp; //当前映射尚未存在,保存映射关系
mp2[tmp] = pattern[j];
j++;
}
if(j < lenp) return false; //pattern串未扫描完
return true;
}
};