パターン
pattern
と文字列が与えられs
、s
それがpattern
のパターンと一致するかどうかを判断してください。
空でない文字列への 1 つの文字の全単射マッピングがある場合、文字列はs
一致します。つまり、の各文字がマッピング先の文字列で置き換えられるpattern
場合、最終的な文字列は になります。全単射とは、マッピングの両側の間に 1 対 1 の対応があることを意味し、2 つの文字が同じ文字列にマッピングされたり、1 つの文字が 2 つの異なる文字列にマッピングされることはありません。pattern
s
問題の解決策についての自分自身の理解
私が調べた答えは次のコードでした。最初は「検索後に mymap[cur] を空に戻す必要がある理由」が理解できませんでした。後の例:pattern:“abba”,s = “dogcatcatdog”
デモンストレーションの後、理由が分かりました。その理由は、コメントの形式は次のようになります。コード内では次のようになります。
class Solution {
public:
unordered_map<char,string> mymap;
string all_pattern;
bool dfs_search(int index, string s){
// 结束条件
if(index >= all_pattern.size()){
if(s == "") return true;
else return false;
}
char cur = all_pattern[index];
if(mymap[cur] != ""){
// 如果已经有映射,直接往下走
// 6、由于“b“已经有映射了且mymap["b"] = "o",经过这个if判断,会return false
// 因此:此时 s = "gcatcatdog", “o” != s.substr(0,1) = "g"
if(s.size() >= mymap[cur].size()
&& mymap[cur] == s.substr(0,mymap[cur].size()))
return dfs_search(index+1,s.substr(mymap[cur].size()));
return false;
}else {
// 如果没有映射,开始探索
string tmp_cur;
// 0、当index = 0,s = "dogcatcatdog"时,此时哈希表为空还没有映射
// 3、当index = 1,s = "ogcatcatdog"时,此时“b“还没有映射
for(int i = 0;i<s.size();i++){
// 1、令"a"映射到"d",即:mymap["a"] = "d"
// 4、令"b"映射到"o",即:mymap["b"] = "o"
tmp_cur = tmp_cur+s[i];
mymap[cur] = tmp_cur;
// 确定不同字符映射 不会相同!
bool back1 = true;
for(auto each:mymap){
if(each.first != cur && each.second == tmp_cur){
back1 = false;
break;
}
}
if(back1 == false) continue;
// 确定后续使用正确
// 2、dfs(1,"ogcatcatdog")
// 5、dfs(2,"gcatcatdog")
bool back2 = dfs_search(index+1,s.substr(mymap[cur].size()));
// 7、back2 = false,说明后续错了,进入下一个循环,i = 1
// 8、进入下一个循环之后,mymap["b"] = "og",接着因为back2又是false,
// 又进入下一个循环,mymap["b"]会一直遍历到"gcatcatdog",都不发现不合适,则
// 退出循环,也就是说没有找到mymap["b"]的映射,因此结束搜索
if(back2 == true) return true;
}
// 结束搜索一定要还原为空!
// 因为找不到mymap["b"]的映射,所以 mymap[cur] = ""
// 9、 接下来则会回到上一层递归,上一层递归是什么时候呢?
// 就是令"a"映射到"d",即:mymap["a"] = "d",这个递归中i才等于0呢,还可以去考虑
// i=1时,使得 mymap["a"] = "do"的情况,且因为“b”的映射重置了,
// 所以再去搜索“b”的映射,过程同之前梳理的一样。
mymap[cur] = "";
}
return false;
}
bool wordPatternMatch(string pattern, string s) {
all_pattern = pattern;
for(auto c:pattern){
mymap[c] = "";
}
return dfs_search(0,s);
}
};