20.12.16 290. 单词规律

题目

给定一种规律 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

示例 4:
输入: pattern = "abba", str = "dog dog dog dog"
输出: false
说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。

思路

  1. 纯模拟,不过提交了四次错误答案,都是跟着答案改的,因为很多情况没想到
  2. 第一次补了set,第二次补了j!=size,第三次补了i!=size,第四次补了str==""的情况
  3. 思路就是,遍历pattern,用map存对应的单词string,用set判断string是否已经存在了(即避免不同pattern相同sting的情况),如果map没有pattern[i],则插入map,并更新set;如果map有,则判断string和map里的string是否相同
  4. 如果pattern没遍历完或s没遍历完,都是错误情况

代码

class Solution {
public:
    bool wordPattern(string pattern, string s) {
        unordered_map<char, string> rec;
        unordered_set<string> check;
        int i = 0, j = 0, pCount = 0, sCount = 0;
        for(; i < pattern.size(); ++i){
            while(s[j] == ' ') ++j;

            string str; 
            for(; j < s.size(); ++j){
                if(s[j] == ' ') break;
                str += s[j];
            }
            if(str == "") return false;

            if(rec.count(pattern[i]) == 0){
                if(check.count(str) != 0) return false;
                check.insert(str);
                rec[pattern[i]] = str;

            }else{
                if(rec[pattern[i]] != str) return false;
            }
        }
        
        if(j != s.size() || i != pattern.size()) return false;
        return true;
    }
};
posted @ 2020-12-16 07:26  肥斯大只仔  阅读(50)  评论(0编辑  收藏  举报