290. Word Pattern
問題描述:
Given a pattern
and a string str
, find if str
follows the same pattern.
Here follow means a full match, such that there is a bijection between a letter in pattern
and a non-empty word in str
.
Example 1:
Input: pattern ="abba"
, str ="dog cat cat dog"
Output: true
Example 2:
Input:pattern ="abba"
, str ="dog cat cat fish"
Output: false
Example 3:
Input: pattern ="aaaa"
, str ="dog cat cat dog"
Output: false
Example 4:
Input: pattern ="abba"
, str ="dog dog dog dog"
Output: false
Notes:
You may assume pattern
contains only lowercase letters, and str
contains lowercase letters separated by a single space.
解題思路:
這道題要求我們求句子是否滿足pattern。
有兩個輸入:pattern 和 str,其中pattern以字符為單位,str以單詞為單位。
若兩個輸入的單位長度不相同,則一定不匹配。
其中不相同有兩種可能:
1. pattern 長,str短
2.pattern 短,str長
我決定使用stringstream來讀取str中的單詞。
在讀取是用i來標記單詞的下標同時訪問pattern中的字符。
用兩個map來存儲,這裏認為char和word是一一對應的。
首先檢查i是否超出pattern的長度,然後檢查當前單詞是否有代表的字符出現:
1.若有,則需要比較是否相同。不相同則返回false
2.若沒有,則需要查詢當前字母是否代表了其他單詞。若代表其他單詞,則需要返回false
否則將這個字母和單詞的對應加入map
註意在最後的時候檢查i == pattern.size(),若不等於則說明pattern過長
代碼:
class Solution { public: bool wordPattern(string pattern, string str) { unordered_map<string, char> m; unordered_map<char, string> p; stringstream ss(str); string tmp; int i = 0; while(getline(ss, tmp, ‘ ‘)){ if(i >= pattern.size()) return false; if(m.count(tmp) != 0){ if(m[tmp] != pattern[i]) return false; }else{ if(p.count(pattern[i]) != 0) return false; m[tmp] = pattern[i]; p[pattern[i]] = tmp; } i++; } if(i < pattern.size()) return false; return true; } };
290. Word Pattern