Leetcode: 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.
Examples:
1. pattern = "abba"
, str = "dog cat cat dog"
should return true
.
2. pattern = "abba"
, str = "dog cat cat fish"
should return false
.
3. pattern = "aaaa"
, str = "dog cat cat dog"
should return false
.
4. pattern = "abba"
, str = "dog dog dog dog"
should return false
.
Notes:
You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space.
这个题目相对来说比较简单,只需要一个一个检测pattern中的每个字母和str中的每个子串是否满足一一对应的关系即可。从pattern match到str可以使用一个长度为26的vector,从str match到pattern则可以使用一个hash表(unordered_map)来实现。
代码:
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string> p2s(26, string(""));
unordered_map<string, char> s2p;
int plen = pattern.size(), slen = str.size(), start = 0, end = 0, p = 0;
if(plen == 0) return slen == 0;
while(start < slen && p < plen){
end = start;
while(end < slen && str[end] != ' ') ++end;
string sstr = str.substr(start, end - start);
if(p2s[pattern[p] - 'a'] == ""){
if(s2p.find(sstr) == s2p.end()){ // find a new match
p2s[pattern[p] - 'a'] = sstr;
s2p[sstr] = pattern[p];
}else return false;
}else{
if(p2s[pattern[p] - 'a'] != sstr) return false;
else if(s2p.find(sstr) == s2p.end()) return false;
else if(s2p[sstr] != pattern[p]) return false;
}
start = end + 1;
++p;
}
if(!(start == slen + 1 && p == plen)) return false;
return true;
}
};