题目描述
给定一种 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 str) {
vector<string> vect;
string::size_type st1 = 0,st2;
st2 = str.find_first_of(" ");
while(st1 != string::npos){
if(st2 == string::npos) st2 = str.length();
string tmp = str.substr(st1,st2-st1);
vect.push_back(tmp);
if(st2 == str.length()) break;
st1 = st2 + 1;
st2 = str.find_first_of(" ",st1);
}
if(pattern.length() != vect.size()) return false;
map<char,string> p2s;
map<string,char> s2p;
for(int i=0;i<pattern.length();i++){
if(p2s.find(pattern[i]) == p2s.end() && s2p.find(vect[i]) == s2p.end()){
p2s[pattern[i]] = vect[i];
s2p[vect[i]] = pattern[i];
}else{
if(p2s.find(pattern[i]) != p2s.end()){
if(p2s[pattern[i]] != vect[i]) return false;
}
if(s2p.find(vect[i]) != s2p.end()){
if(s2p[vect[i]] != pattern[i]) return false;
}
}
}
return true;
}
};