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.
注意:
(1) “abba” “dog dog dog dog”
(2) “aaa” “dog dog dog dog”
(3) “aaaa” “dog dog dog”
class Solution {
public:
bool wordPattern(string pattern, string str) {
if (&str == nullptr || &pattern == nullptr) {
return false;
}
unordered_map<char, string> patternMap;
char demilit = ' ';
vector<string> splitStr = split(str, demilit);
// "aaaa" "dog dog dog"
// "aaa" "dog dog dog dog"
if (splitStr.size() != pattern.size()) {
return false;
}
int i = 0;
for (auto c : pattern) {
string item = splitStr[i++];
if (patternMap.find(c) == patternMap.end()) {
// "abba" "dog dog dog dog"
for (auto m : patternMap) {
if (m.second.compare(item) == 0) {
return false;
}
}
patternMap[c] = item;
} else {
if (patternMap[c].compare(item) != 0)
return false;
}
}
return true;
}
private:
vector<string> split(const string& str, char delimit) {
stringstream sStream(str);
string item;
vector<string> tokens;
while (getline(sStream, item, delimit)) {
tokens.push_back(item);
}
return tokens;
}
};