题目
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
示例 3:
输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
解题分析
- 根据空格分隔字符串。
- 建立双向的映射表 (char, string) 和 (string, char)的双向映射列表。
- 只要判断两个双映射表比对过程中不符合条件的就判断fasle,所有的都满足条件就判断为true。
代码
class Solution {
public:
bool wordPattern(string pattern, string s) {
unordered_map<char, string> _mp;
unordered_map< string, char> _mp_rev;
auto split_fn = [&]()->vector<string>{
vector<string> res;
int begin = 0;
int end = 0;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == ' ')
{
res.push_back(s.substr(begin, end-begin ));
begin = end + 1;
}
end = end +1;
}
if (begin < end)
{
res.push_back(s.substr(begin, end-begin ));
}
return res;
};
auto strs = split_fn();
if (strs.size() != pattern.length())
{
return false;
}
for (int i = 0 ; i < pattern.length(); i++)
{
if (_mp.count(pattern[i]) == 0)
{
_mp[pattern[i]] = strs[i];
}
if (strs[i] != _mp[pattern[i]])
{
return false;
}
if (_mp_rev.count(strs[i] ) == 0)
{
_mp_rev[strs[i]] = pattern[i];
}
if (pattern[i] != _mp_rev[strs[i]])
{
return false;
}
}
return true;
}
};