给定一种规律 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示例 4:
输入: pattern = “abba”, str = “dog dog dog dog”
输出: false说明: 你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。
各种容器乱用版本
class Solution {
public:
bool wordPattern(string pattern, string s) {
map<char,string> mp;//记录映射关系
vector<string> vec;//分离单词数组
string str="";
for(int i=0;i<s.size();i++)
{
if(s[i]!=' ')
{
str+=s[i];
}
else
{
vec.push_back(str);
str=s[++i];
}
}
vec.push_back(str);
if(vec.size()!=pattern.size())
return false;
set<string> se;//检查重复项
for(int i=0;i<pattern.size();i++)
{
if(mp.count(pattern[i]))
{
if(mp[pattern[i]]!=vec[i])
return false;
}
else
{
if(se.count(vec[i]))
return false;
se.insert(vec[i]);
mp[pattern[i]]=vec[i];
}
}
return true;
}
};
优化版本
因为要唯一对应,所以要考虑各种特殊情况,比如
[aaaa]与[cat dog dog cat]、[abba]与[cat cat cat cat]时输出true
需要两个map来对应检查。
!(ss>>s)检查对应数量不匹配问题
[aaaa]与[cat dog dog]
return (ss >> s) ? false : true;检查
[aaa]与[cat dog dog cat]
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<char, string> map;//检查映射关系
unordered_map<string, char> rmap;//反向检查
stringstream ss(str); //分割单词
string s;
for(char c : pattern) {
if(!(ss >> s) || (map.count(c) == 1 && map[c] != s) || (rmap.count(s) == 1 && rmap[s] != c)) return false;
map[c] = s; rmap[s] = c;
}
return (ss >> s) ? false : true;
}
};