给定一种规律 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 包含了由单个空格分隔的小写字母。
通过次数25,381提交次数59,271
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-pattern
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
利用map,对pattern和str进行一一匹配,每次有新的pattern和str对的时候检查是否相对应,同时记录pattern和str的数量,如果出现不对应或者遍历结束,数量不同,则返回false,否则返回true。
注意:需要进行双向的hash匹配,但是可以不需要两个map,因为可以使用int类型的大小为128的数组对pattern进行记录,当没有在map之中找到str对于的pattern是,需要进行插入操作,但在这之前需要进行检查,如果出现了pattern之前已经用过,即数组中已经标记为用过,而此时的str不对应当前的pattern,需要返回false。(不对应的情况)
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<string,int> str_hash;
vector<int> pattern_hash(128,0);
int len_str = str.size();
int len_pattern = pattern.size();
int strl = 0 ;
int im = 0;
for(int i = 0,j=0;i<len_str&&j<len_pattern;i++,j++)
{
string temps = "";
while(i<len_str&&str[i]!=' ')
{
temps+=str[i];
i++;
}
im = im>i?im:i;
strl++;
unordered_map<string,int>::iterator it;
it = str_hash.find(temps);
//cout<<"temps:"<<temps<<endl;
//cout<<"pattern[j]:"<<pattern[j]<<endl;
if(it!=str_hash.end()&&it->second!=pattern[j])
{
return false;
}
else if(it==str_hash.end())
{
if(pattern_hash[pattern[j]]!=0)
{
return false;
}
else
{
str_hash.insert(pair<string,int>(temps,pattern[j]));
pattern_hash[pattern[j]]++;
}
}
}
cout<<im;
if(strl!=len_pattern||im!=len_str)return false;
return true;
}
};