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.
算法
o(n)
先对str分词,也可以一边遍历pattern一边分词
字符->字符串,可以array也可以map
- array的方法
public:
bool wordPattern(string pattern, string str) {
string mp[26];
int i=0;
for(auto c:pattern){
string word="";
//go pass space
while(str[i]!='\0' && !isalpha(str[i]))
++i;
//get word
while(str[i]!='\0' && isalpha(str[i]))
word+=str[i++];
if(word== "")
return false;
if(mp[c-'a']==""){
for(int i=0;i<26;++i)
if(mp[i]==word)
return false;
mp[c-'a']=word;
}else{
if(mp[c-'a']!=word)
return false;
}
}
return str[i]=='\0';
}
};
- map 的写法
o(nlgn)
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<char,string> mp;
int i=0;
for(auto c:pattern){
string word="";
//go pass space
while(str[i]!='\0' && !isalpha(str[i]))
++i;
//get word
while(str[i]!='\0' && isalpha(str[i]))
word+=str[i++];
if(word== "")
return false;
if(mp.find(c)==mp.end()){
for(auto i:mp)
if(i.second==word)
return false;
mp[c]=word;
}else{
if(mp[c]!=word)
return false;
}
}
return str[i]=='\0';
}
};