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.
实现:
class Solution {
public:
int getNextWord(string& out, const string& str, int begin)
{
while (str[begin] == ' ')
{
begin++;
if (begin >= str.length()) {
return begin;
}
}
int idx = begin;
while (str[begin] != ' ' && str.length() > begin) {
begin++;
}
out = str.substr(idx, begin - idx);
return begin;
}
bool wordPattern(string pattern, string str) {
int start = 0;
string word;
map smap;
map cmap;
for (int i = 0; i < pattern.size(); ++i)
{
if (start >= str.length()) return false;
start = getNextWord(word, str, start);
auto pos = smap.find(pattern[i]);
auto iter = cmap.find(word);
if (pos != smap.end()) {
if (pos->second.compare(word) != 0)
return false;
}
else if (iter != cmap.end()){
return false;
}else{
smap[pattern[i]] = word;
cmap[word] = pattern[i];
}
}
return start == str.length();
}
};