LeetCode290. 單詞規律
阿新 • • 發佈:2020-08-27
可以用兩個雜湊表分別記錄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; } };