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.
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string>vc;
map<char,string>m1;
map<string,char>m2;
if(pattern.length()==0 && str.length()!=0) return false;
if(pattern.length()!=0 && str.length()==0) return false;
int len1 = pattern.size();
int len2 = str.size();
string word;
for(int i =0; i < len2; i++)
{
if(str[i] != ' ')
word += str[i];
else
{
vc.push_back(word);
word = "";
}
if(i==len2-1)
vc.push_back(word);
}
if(vc.size() != len1) return false;
for(int j =0; j <len1; j++)
{
map<char,string>::iterator it1;
map<string, char>::iterator it2;
it1 = m1.find(pattern[j]);
it2 = m2.find(vc[j]);
if(it1==m1.end() && it2==m2.end())
{
m1[pattern[j]] = vc[j];
m2[vc[j]] = pattern[j];
}
else if(it1!=m1.end() && it2!=m2.end())
{
if(m1[pattern[j]] != vc[j] || m2[vc[j]]!= pattern[j])
return false;
}
else return false;
}
return true;
}
};