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.
【思路】 c++ 没有split函数 所以需要手动分割str; 第一次commit失败了 发现 abba 与 “cat cat cat cat” 这个漏洞
所以 要用两个hashtable 双向验证
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<char,string> map;
unordered_map<string,char> map2;
vector<string> vec;
int j=0;
for(int i=0;i<str.size();i++){
if(str[i]==' '){
string tmp =str.substr(j,i-j);
vec.push_back(tmp);
j=i+1;
}
if(i==str.size()-1){
string tmp =str.substr(j,i-j+1);
vec.push_back(tmp);
}
}
if(pattern.size()!=vec.size())return false;
for(int i=0;i<pattern.size();i++){
if(map.find(pattern[i])==map.end()&&map2.find(vec[i])==map2.end()){
map.insert(make_pair(pattern[i],vec[i]));
map2.insert(make_pair(vec[i],pattern[i]));
}
else if(map[pattern[i]]!=vec[i]||map2[vec[i]]!=pattern[i])return false;
}
return true;
}
};