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> s;
int len = 0;
int i;
int lenStr = str.length();
int lenP = pattern.length();
int last = 0;
for(i=0; i<lenStr; i++) //取得每个单词
{
if(str[i] == ' ')
{
string sub = str.substr(last, i-last);
s.push_back(sub);
cout << sub;
last += sub.length() + 1;
}
}
string sub = str.substr(last, lenStr - last); //最后一个单词
s.push_back(sub);
if(lenP != s.size() && lenP != 1)
return false;
int same[lenP][lenP]; //图,单词i与单词j应该相同为1,否则为0
int j;
for(i=0; i<lenP; i++)
for(j=i+1; j<lenP; j++)
if(pattern[i] == pattern[j])
same[i][j] = same[j][i] = 1;
else
same[i][j] = same[j][i] = 0;
for(i=0; i<lenP; i++)
for(j=0; j<i; j++)
if(s[i] == s[j] && !same[i][j] || s[i] != s[j] && same[i][j])
return false;
return true;
}
};