1、我的想法。跟之前205同构字符串的思路类似。
class Solution {
public:
bool wordPattern(string pattern, string str) {
int i = 0, pre = 0;
string::size_type pos;
string temp;
unordered_map<char, string> hash1;
unordered_map<string, char> hash2;
for(; i<pattern.size(), pre<str.size(); i++){
pos = str.find(" ", pre);
if(pos == str.npos){
pos = str.size();
}
temp = str.substr(pre, pos-pre);
cout << temp << ".";
pre = pos+1;
if((hash1.count(pattern[i]) && hash1[pattern[i]] != temp)||(hash2.count(temp) && hash2[temp] != pattern[i])){
return false;
}
hash1[pattern[i]] = temp;
hash2[temp] = pattern[i];
}
if(pos < str.size() || i<pattern.size()){
return false;
}
return true;
}
};
2、官方思路与我大致相同。
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<string, char> str2ch;
unordered_map<char, string> ch2str;
int m = str.length();
int i = 0;
for (auto ch : pattern) {
if (i >= m) {
return false;
}
int j = i;
while (j < m && str[j] != ' ') j++;
const string &tmp = str.substr(i, j - i);
if (str2ch.count(tmp) && str2ch[tmp] != ch) {
return false;
}
if (ch2str.count(ch) && ch2str[ch] != tmp) {
return false;
}
str2ch[tmp] = ch;
ch2str[ch] = tmp;
i = j + 1;
}
return i >= m;
}
};