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.
还没有想到好的优化办法。利用两个哈希表最双向对应。好像有点笨笨的感觉。
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<char, string> temp;
map<string, char> temp1;
int j = 0;
int i = 0;
for( i = 0; i < pattern.size() && str[j] != '\0'; ++i)
{
string tempS= "";
while(str[j] != ' ' && str[j] != '\0')
{
tempS += str[j];
// cout << tempS[j] << endl;
++j;
}
if(str[j] != '\0')
++j;
//cout << tempS << endl;
if(temp.find(pattern[i]) == temp.end())
temp[pattern[i]] = tempS;
else
{
cout << pattern[i] << " " << tempS << endl;
//cout << tempS[0] << endl;
if(temp[pattern[i]] != tempS)
{
// cout << 1 << pattern[i] << " " << tempS[tempS.size() - 2] << endl;
return false;
}
}
if(temp1.find(tempS) == temp1.end())
temp1[tempS] = pattern[i];
else
{
cout << pattern[i] << " " << tempS << endl;
//cout << tempS[0] << endl;
if(temp1[tempS] != pattern[i])
{
// cout << 1 << pattern[i] << " " << tempS[tempS.size() - 2] << endl;
return false;
}
}
}
if(i != pattern.size() || str[j] != '\0')
return false;
return true;
}
};