// 此题需要注意的是,哈希表在存储的时候插入顺序可能是随机的,如果此时要求两个表的key的相应位置一一对应不可行,需要以value为键值再建一个表
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string> str_vec;
while (str.find(' ') != -1)
{
str_vec.push_back(str.substr(0, str.find(' ')));
str = str.substr(str.find(' ') + 1, str.length() - str.find(' ') - 1);
}
str_vec.push_back(str);
for (int i = 0; i < str_vec.size(); i++)
cout << str_vec[i].c_str() << ' ';
if (str_vec.size() != pattern.length())
return false;
unordered_map<char, int> pattern_map;
unordered_map<string, int> str_map;
for (int i = 0; i<pattern.size(); i++)
{
if (pattern_map.find(pattern[i]) == pattern_map.end())
pattern_map.insert(make_pair(pattern[i], i));
else
pattern_map[pattern[i]] = pattern_map[pattern[i]] * 10 + i;
}
for (int i = 0; i<str_vec.size(); i++)
{
if (str_map.find(str_vec[i]) == str_map.end())
str_map.insert(make_pair(str_vec[i], i));
else
str_map[str_vec[i]] = str_map[str_vec[i]] * 10 + i;
}
unordered_map<char, int>::iterator pattern_it = pattern_map.begin();
unordered_map<string, int>::iterator str_it = str_map.begin();
if (pattern_map.size() != str_map.size())
return false;
unordered_map<int, int> pattern_pos;
unordered_map<int, int> str_pos;
for (; pattern_it != pattern_map.end() && str_it != str_map.end(); pattern_it++, str_it++)
{
pattern_pos.insert(make_pair(pattern_it->second, 1));
str_pos.insert(make_pair(str_it->second, 1));
}
unordered_map<int, int>::iterator pattern_pos_it = pattern_pos.begin();
for (; pattern_pos_it != pattern_pos.end(); pattern_pos_it++)
if (str_pos.find(pattern_pos_it->first) == str_pos.end())
return false;
return true;
}
};