题目描述:
给定一种规律 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 字符的映射(哈希)使用数组used[128]记录pattern字符是否使用
2,遍历str按照空格拆分单词,同时对应用的向前移动指向pattern字符的指针,没拆分出一个单词,判断:
如果该单词从未出现在哈希表中:
如果当前的pattern字符已经被使用,则返回false;
将单词与当前的pattern字符做映射;
标记当前指向的pattern字符已经被使用
否则:
如果当前的单词在哈希表中的映射字符不是当前指定的pattern字符,那么返回false。
3.若单词的个数与pattern的字符个数不匹配,返回false。
代码实现:
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<string,char> word_map; //单词到pattern的映射
char used[128]={0}; //已经被映射的pattern字符
string word=""; //临时保存拆分出的单词
int pos=0; //当前指向的pattern字符
str.push_back(' '); //str尾部push一个空格,是遇到空格就拆分字符。
for(int i=0;i<str.length();i++){
if(str[i]==' '){ //遇到空格,就拆出字符
if(pos==pattern.length()){ //如果已经拆出单词,但是已经没有pattern可以进行对应了
return false;
}
if(word_map.find(word)==word_map.end()){
if(used[pattern[pos]]){ //如果当前pattern已经使用
return false;
}
word_map[word]=pattern[pos];
used[pattern[pos]]=1;
}else{
if(word_map[word]!=pattern[pos]){ //如果当前word已经建立了映射,无法与当前的pattern对应。
return false;
}
}
word="";
pos++;
}else{
word+=str[i];
}
}
if(pos!=pattern.length()){
return false; //有多余的pattern字符
}
return true;
}
};