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.
简单版:将str分开,存入数组,再进行pattern循环匹配。
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string>str_list;
string tmp_s="";
int n=0;
while(true){
n=str.find(" ");
if(n<0){
tmp_s=str.substr(0,str.length());
str_list.push_back(tmp_s);
break;
}
tmp_s=str.substr(0,n);
str.erase(0,n+1);
str_list.push_back(tmp_s);
}
int len=pattern.length();
if(len!=str_list.size())
return false;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(pattern[i]==pattern[j]){
if(str_list[i]!=str_list[j]){
return false;
}
}else{
if(str_list[i]==str_list[j]){
return false;
}
}
}
}
return true;
}
};
使用map,建立key-value关系,若key存在则比较值,由于map不能按值查找,所以要对不存在的key查找是否值已经存在,这样效率并不是减少太多
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string>str_list;
string tmp_s="";
int n=0;
while(true){
n=str.find(" ");
if(n<0){
tmp_s=str.substr(0,str.length());
str_list.push_back(tmp_s);
break;
}
tmp_s=str.substr(0,n);
str.erase(0,n+1);
str_list.push_back(tmp_s);
}
int len=pattern.length();
if(len!=str_list.size())
return false;
map<char,string> maplist;
for(int i=0;i<len;i++){
bool it=maplist.count(pattern[i]);
if(it){
if(str_list[i]!=maplist[pattern[i]])
return false;
}else{
for(map<char,string>::iterator it=maplist.begin();it!=maplist.end();it++){
if(it->second==str_list[i])
return false;
}
maplist.insert(pair<char,string>(pattern[i],str_list[i]));
}
}
return true;
}
};