题目描述:
给定一种规律 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 包含了由单个空格分隔的小写字母。
方法1:
主要思路:
(1)首先将字符串转换成对应的单词组成;
(2)将单词组成和模式字符串进行相互映射,判断是否满足模式关系;
class Solution {
public:
bool wordPattern(string pattern, string str) {
//将字符串转换成单词组成
istringstream iss(str);
string tmp;
vector<string> strs;
while( iss>>tmp){
strs.push_back(tmp);
}
//若单词个数和模式字符串的长度不一致,直接返回false
if(strs.size()!=pattern.size()){
return false;
}
//相互映射
unordered_map<char,string> mp_ch_str;
unordered_map<string,char> mp_str_ch;
for(int i=0;i<pattern.size();++i){
string tmp=strs[i];
//若两个映射都存在,但映射的结果不一致,则直接返回false
if(mp_ch_str.count(pattern[i])&&mp_str_ch.count(tmp)){
if(tmp!=mp_ch_str[pattern[i]]){
return false;
}
}
//若两个映射都不存在,则插入该映射
else if(mp_ch_str.count(pattern[i])==0&&mp_str_ch.count(tmp)==0){
mp_ch_str[pattern[i]]=tmp;
mp_str_ch[tmp]=pattern[i];
}
else {//若一个映射存在,另一个映射不存在,则直接返回false
return false;
}
}
return true;
}
};