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) {
map<char, string>trans;
set<string>hist;
for (int i = 0; i < pattern.size() - 1; i++)
{
int pos = str.find(' ');
if (pos == string::npos)
return false;
string s = string(str.begin(), str.begin() + pos);
if (trans.find(pattern[i]) == trans.end())
{
if (hist.find(s) != hist.end())
return false;
hist.insert(s);
trans[pattern[i]] = s;
}
else
{
if (trans[pattern[i]] != s)
return false;
}
str.erase(0, pos + 1);
}
if (trans.find(pattern.back()) == trans.end())
{
if (hist.find(str) != hist.end())
return false;
}
else
{
if (trans[pattern.back()] != str)
return false;
}
return true;
}
};
accept