使用两个map,来分别存放一一对应。细节方面就是对于字符的切割,以及如何查询map的键值是否存在。
class Solution {
public:
bool wordPattern(string pattern, string str) {
if(str.size() == 0 && pattern.size() == 0) return true;
vector<string> vec;
preprocess(str, vec);
if(vec.size() != pattern.size()) return false;
unordered_map<char, string> csmap;
unordered_map<string, char> scmap;
for(int i = 0; i < pattern.size(); ++ i) {
string word = csmap[pattern[i]];
if(word.size() == 0) {
csmap[pattern[i]] = vec[i];
if(scmap[vec[i]]) return false;
scmap[vec[i]] = pattern[i];
}
else {
if(word != vec[i]) return false;
}
}
return true;
}
private:
void preprocess(string str, vector<string>& vec) {
if(str.size() == 0) return;
int i = 0;
for(; i < str.size(); ++ i) {
if(str[i] == ' ') break;
}
if(i == str.size()) vec.push_back(str);
else {
vec.push_back(str.substr(0, i));
preprocess(str.substr(i+1), vec);
}
}
};
class Solution {
public:
bool wordPattern(string pattern, string str) {
if(pattern.empty() && str.empty()) return true;
if(pattern.empty() || str.empty()) return false;
vector<string> word;
process(str, word);
if(word.size() != pattern.size()) return false;
unordered_map<char, string> cTos;
unordered_map<string, char> sToc;
for(int i = 0; i < pattern.size(); ++ i) {
if(cTos.find(pattern[i]) == cTos.end() && sToc.find(word[i]) == sToc.end()) {
cTos[pattern[i]] = word[i];
sToc[word[i]] = pattern[i];
}
else if(cTos.find(pattern[i]) == cTos.end() || sToc.find(word[i]) == sToc.end())
return false;
else {
if(cTos[pattern[i]] != word[i]) return false;
if(sToc[word[i]] != pattern[i]) return false;
}
}
return true;
}
private:
void process(string& s, vector<string>& word) {
while(!s.empty()) {
int pos = s.find(' ');
if(pos == -1) {
word.push_back(s);
s.clear();
}
else {
word.push_back(s.substr(0, pos));
s = s.substr(pos + 1);
}
}
}
};