题解 | #牛群智能指导系统#

牛群智能指导系统

https://www.nowcoder.com/practice/94e01098fe8f4941ba90fb64ab2d7025

知识点

哈希

思路

用map维护左侧pattern字符串的每一个char字符到右侧plan字符串中的每一个字符中的映射。注意映射的顺序,例如 aaaa 对YUAN YUAN SHEN SHEN ,如果反向映射的话,需要在映射前检查映射结果是否已经存在过,会导致时间复杂度的上升。

回到笔者做法,对于pattern中每一个字符,若合法就只会对应一个plan中字符串,所以我们同步枚举字符串和字符,检查他们的映射匹配性就可以: 若映射不存在,则建立映射

若存在,则检查是否匹配,不匹配直接返回false了

若检查完毕仍无false,则返回true

详解看代码注释。

代码c++

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pattern string字符串
     * @param plan string字符串
     * @return bool布尔型
     */
    bool isValidPattern(string pattern, string plan) {
        // write code here
        map<char, string>mp;//字符到字符串
        map<char, int>mp2;//判断是否已对字符建立过映射
        int idx = 0;//pattern下标,从0开始
        string s = "";//原字符串为空
        for (int i = 0; i < plan.size(); i++) {
            if (plan[i] == ' ') {//遇到空格了,字符串完成收集,开始检查
                //  cout << s << "  " << mp2[pattern[idx]] << "  " << mp[pattern[idx]] << endl;
                if (mp2[pattern[idx]] == 0) {
                  //未建立映射。建立一下并标记
                    mp[pattern[idx]] = s;
                    mp2[pattern[idx]] = 1;

                } else {
                //已建立,检查一不一样,不一样返回false
                    if (mp[pattern[idx]] !=s) {                 
                        return false;
                    }
                }

                s = "";//检查完毕,清空字符串
                idx++;//pattern字符串下标右移,到下一个字符
            }

            else  s += plan[i];//不为空格,继续收集字符串
        }
        //注意这个再判一次,因为最后一个字符串后面是没有空格的,收集完手动判就行了
        if (mp2[pattern[idx]] == 0) {
            mp[pattern[idx]] = s;
            mp2[pattern[idx]] = 1;

            idx++;
        } else {
            if (mp[pattern[idx]] != s) {
                return false;
            }
        }

        return true;//一直都没return false,那就return true
    }

};
};
全部评论

相关推荐

10-15 15:00
潍坊学院 golang
跨考小白:这又不是官方
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务