给你一种规律 pattern 和一个字符串 str,请你判断 str 是否遵循其相同的规律。
这里我们指的是 完全遵循,例如 pattern 里的每个字母和字符串 str 中每个 非空 单词之间,存在着 双射 的对应规律。双射 意味着映射双方一一对应,不会存在两个字符映射到同一个字符串,也不会存在一个字符分别映射到两个不同的字符串。
示例:
输入:pattern = “abab”, s = “redblueredblue”
输出:true
解释:一种可能的映射如下:
‘a’ -> “red”
‘b’ -> “blue”
回溯
class Solution {
public:
bool wordPatternMatch(string pattern, string s) {
if(pattern.size()>s.size()) return false;
unordered_map<char,string> hash;
unordered_set<string>se;
return track_back(pattern,s,0,0,hash,se);
}
bool track_back(string pattern,string str,int indexs,int indexp,unordered_map<char,string>& hash,unordered_set<string>& se){
if(indexs==str.size()&&indexp==pattern.size())
return true;
else if(indexs==str.size()||indexp==pattern.size())
return false;
if(hash.count(pattern[indexp])) {
string temp = hash[pattern[indexp]];
for(int i=0;i<temp.size();i++){
if(indexs+i>=str.size()||str[indexs+i]!=temp[i]) return false;
}
return track_back(pattern,str,indexs+temp.size(),indexp+1,hash,se);
}
else {
for(int i=1;i+indexs<=str.size()-(pattern.size()-indexp)+1;i++){
string temp = str.substr(indexs,i);
if(se.count(temp)) continue;
se.insert(temp);
hash[pattern[indexp]] = temp;
if(track_back(pattern,str,indexs+i,indexp+1,hash,se)) {
return true;
}
se.erase(temp);
}
hash.erase(pattern[indexp]);
return false;
}
}
};