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 包含了由单个空格分隔的小写字母。

第一版,自己写的,参照以前的一个题目,经典的hash方法,非常好

执行用时 :4 ms, 在所有 cpp 提交中击败了76.14%的用户

内存消耗 :8.4 MB, 在所有 cpp 提交中击败了81.29%的用户

bool wordPattern(string pattern, string str) {

    unordered_map<char, int> patMp;
    unordered_map<string, int> strMp;
    string temp = "";
    int a = 1;
    unsigned i, j;
    for (i = 0, j = 0; i < pattern.size() && j < str.size(); ++j, ++i) {
        temp = "";
        patMp[pattern[i]] += i+a;
        //cout << "pat " << pattern[i] << " int " << patMp[pattern[i]] << endl;
        while (str[j] != ' ' && j < str.size()) {
            temp += str[j++];
        }
        strMp[temp] += i+a;
        //cout << "str " << temp << " int " << strMp[temp] << endl;

        if (patMp[pattern[i]] != strMp[temp]) return false;
}
    //cout << i <<" "<< j << endl;
    return i==pattern.size()&&j==str.size()+1;
}