1. 程式人生 > 實用技巧 >LeetCode290. 單詞規律

LeetCode290. 單詞規律

可以用兩個雜湊表分別記錄pattern到str(即字母到單詞)和str到pattern(即單詞到字母)的對映。

然後檢查兩個雜湊表中的記錄,比如某個字母之前已經對映到某個單詞,但存在和這個對映矛盾的對映(字母對映到別的單詞),
或者是存在某個矛盾的從單詞到字母的對映,就返回false。

否則,遍歷完發現不存在矛盾的情況,就返回true。

程式碼如下:

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        vector<string> words;
        for(int i = 0; i < str.size(); ++i) {                  // 因為str裡含有空格,所以我們用雙指標先把所有的非空單詞拆出來,放到一個vector<string> words裡
            while(i < str.size() && str[i] == ' ') {
                ++i;
            }
            int j = i;
            while(j < str.size() && str[j] != ' ') {
                ++j;
            }
            string word = str.substr(i, j - i);
            words.push_back(word);
            i = j;
        }
        if(words.size() != pattern.size()) {                              // 如果pattern中字母數量和str的單詞數量不同,就無法匹配
            return false;
        }
        int size = pattern.size();
        unordered_map<char, string> Hash1;                              // Hash1記錄pattern中的字母對應str中的單詞的對映,Hash2相反
        unordered_map<string, char> Hash2;
        for(int i = 0; i < size; ++i) {
            char p = pattern[i];
            string s = words[i];
            if(Hash1.count(p) != 0 && Hash1[p] != s) {                 // 如果之前字母p已經映射了一個單詞,且這個單詞和現在字母p對應的單詞s不同,則矛盾
                return false;
            } else {
                Hash1[p] = s;
            }
            if(Hash2.count(s) != 0 && Hash2[s] != p) {                // 如果之前單詞s已經映射了一個字母,且這個字母和現在單詞s對應的字母p不同,則矛盾
                return false;
            } else {
                Hash2[s] = p;
            }
        }
        return true;
    }
};