291. 单词规律 II(plus题)

给你一种规律 pattern 和一个字符串 s,请你判断 s 是否和 pattern 的规律相匹配。

如果存在单个字符到 非空 字符串的 双射映射 ,那么字符串 s 匹配 pattern ,即:如果 pattern 中的每个字符都被它映射到的字符串替换,那么最终的字符串则为 s

双射 意味着映射双方一一对应,不会存在两个字符映射到同一个字符串,也不会存在一个字符分别映射到两个不同的字符串。

自己对一个题解的理解

我看的答案是如下这个代码,我一开始不能理解 "为什么搜索结束后要把mymap[cur]还原为空 ,后来示例:pattern:"abba",s = "dogcatcatdog"进行了演示后,知道了原因,原因以注释的形式贴在了如下代码中:

c 复制代码
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);
    }
};
相关推荐
一只码代码的章鱼1 分钟前
排序算法 (插入,选择,冒泡,希尔,快速,归并,堆排序)
数据结构·算法·排序算法
青い月の魔女21 分钟前
数据结构初阶---二叉树
c语言·数据结构·笔记·学习·算法
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
千天夜1 小时前
多源多点路径规划:基于启发式动态生成树算法的实现
算法·机器学习·动态规划
从以前1 小时前
准备考试:解决大学入学考试问题
数据结构·python·算法
.Vcoistnt2 小时前
Codeforces Round 994 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划
ALISHENGYA2 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战训练三)
数据结构·c++·算法·图论
我码玄黄4 小时前
正则表达式优化之算法和效率优化
前端·javascript·算法·正则表达式
Solitudefire5 小时前
蓝桥杯刷题——day9
算法·蓝桥杯
三万棵雪松6 小时前
1.系统学习-线性回归
算法·机器学习·回归·线性回归·监督学习