原题:
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.
解决方法:
- 先将字符串分成单词;
- 建立单词与模式字符之间的对应哈希表;
- 用哈希表判断是否符合规范。
代码:
std::vector<std::string> split(std::string str, std::string pattern)
{
std::string::size_type pos;
std::vector<std::string> result;
str += pattern;//扩展字符串以方便操作
int size = str.size();
for (int i = 0; i<size; i++)
{
pos = str.find(pattern, i);
if (pos<size)
{
std::string s = str.substr(i, pos - i);
result.push_back(s);
i = pos + pattern.size() - 1;
}
}
return result;
}
bool wordPattern(string pattern, string str) {
std::vector<std::string> words = split(str, " ");
if (words.size() != pattern.size())
return false;
map<char, string> mp1;
map<string, char> mp2;
for(int i = 0; i < words.size(); i++){
if (!mp1.count(pattern[i]) && !mp2.count(words[i])){
mp1[pattern[i]] = words[i];
mp2[words[i]] = pattern[i];
}
else if (mp1.count(pattern[i]) && mp2.count(words[i])){
if (mp1[pattern[i]] != words[i])
return false;
if (mp2[words[i]] != pattern[i])
return false;
}else{
return false;
}
}
return true;
}