c++
class Solution {
public:
bool wordPattern(string pattern, string str) {
if (pattern.empty() && str.empty())
return true;
if (pattern.empty() || str.empty())
return false;
map<char, string> dict;
set<string> cache;
vector<string> listStr = splitString(str);
if (pattern.size() != listStr.size())
return false;
for (size_t i = 0; i < pattern.size(); ++i) {
if (dict.find(pattern[i]) == dict.end()) {
dict[pattern[i]] = listStr[i];
}
else {
if (dict[pattern[i]] != listStr[i])
return false;
}
cache.insert(listStr[i]);
}
if (cache.size() != dict.size())
return false;
return true;
}
private:
vector<string> splitString(const string &str) {
string buf;
stringstream ss(str);
vector<string> tokens;
while (ss >> buf)
tokens.push_back(buf);
return tokens;
}
};
python
class Solution(object):
def wordPattern(self, pattern, str):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
pattern = list(pattern)
str = str.split(' ')
if len(pattern) != len(str):
return False
if len(set(pattern)) != len(set(str)):
return False
dict = {}
for i in xrange(len(pattern)):
if dict.get(pattern[i], 'N/A') == 'N/A':
dict[pattern[i]] = str[i]
else:
if dict[pattern[i]] != str[i]:
return False
return True