给定一种规律 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 包含了由单个空格分隔的小写字母。
思路
观察示例,总结规律
1、每个单词对应唯一一个字符,不能有一对多或者多对一的情况
- 用map即可,每个单词(key)对应一个字符(val)
- 且在map的过程中,需要检查未出现过单词对于的字符之前是否使用过,用used[128]表示
2、因为是用空格作为判断单词的结束的,最后一个单词后面没有空格,所以多加一个空格
3、单词为出现过的情况
- 若切分出单词,但pattern已经走到头,即使拆分了单词也没有对于的字符了,则直接false
- 若单词对应的字符未使用过,则将其加入map
4、单词出现过
- 则判断是否与之前的单词对应
5、将临时存储单词变量word清空,且pattern位置加1
6、拆分完单词了,但pattern却还没遍历完,也是false
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<string,char> wordmap;//单词的映射
char used[128]={0};//防止多个单词应用同一个字符
string word;//拆分的单词
int pos=0;//指向pattern的位置,随着拆分单词的移动
str.push_back(' ');//因为是用空格作为判断单词的结束的,最后一个单词后面没有空格,所以多加一个空格
for(int i=0;i<str.length();i++){
if(str[i]==' '){//拆分好单词了
//若pattern已经走到头,即使拆分了单词也没有对于的字符了,则直接false
if(pos==pattern.length())
return false;
//单词未出现过
if(wordmap.find(word)==wordmap.end()){
//防止多个单词应用同一个字符,需做个判断
if(used[pattern[pos]])
return false;
used[pattern[pos]]=1;
wordmap[word]=pattern[pos];
}
//单词出现过
else{
//单词出现过,对应的字符却不一样
if(wordmap[word]!=pattern[pos])
return false;
}
word="";
pos++;
}
else{
word+=str[i];
}
}
//拆分完单词了,但pattern却还没遍历完
if(pos!=pattern.length())
return false;
//两边都顺利遍历完了,为true
return true;
}
};