题目链接:https://leetcode.com/problems/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:
- pattern =
"abba"
, str ="dog cat cat dog"
should return true. - pattern =
"abba"
, str ="dog cat cat fish"
should return false. - pattern =
"aaaa"
, str ="dog cat cat dog"
should return false. - 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.
思路:一个字母对应一个字符串, 同时一个字符串也要对应一个字符, 这样我们可以同时用两个hash表来检测是否同时匹配. 还有需要注意的是模式串和匹配串长度不一致的问题.
代码如下:
class Solution {
public:
bool wordPattern(string pattern, string str) {
str += " ";
int i = 0, j = 0, len1 = pattern.size(), len2=str.size();
unordered_map<char, string> hash1;
unordered_map<string, char> hash2;
while(i < len1 && j < len2)
{
int pos = str.find(' ', j);
string s = str.substr(j, pos-j);
if(hash1.count(pattern[i]) && hash1[pattern[i]]!=s) return false;
if(hash2.count(s) && hash2[s]!= pattern[i]) return false;
hash1[pattern[i]] = s, hash2[s] = pattern[i];
i++, j = pos+1;
}
return i==len1 && j ==len2;
}
};
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<string, char> hash1;
unordered_map<char, string> hash2;
istringstream is(str);
for(auto ch: pattern)
{
if(is.eof()) return false;
string s;
is >> s;
if(!hash1.count(s) && !hash2.count(ch))
{
hash1[s] = ch, hash2[ch] = s;
continue;
}
if(hash1.count(s) && hash2.count(ch) && hash1[s]==ch && hash2[ch]==s)
continue;
return false;
}
return is.eof();
}
};