题目描述: 单词模式
给定一种 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
包含了由单个空格分隔的小写字母。
解题思路:
第一步:从str中取出字符串,这里写了个函数getstr()。
第二步:循环判断对应的字符和字符串是否在映射中,
不在的话,就添加它们的相互映射;
在的话,如果它们本来就是相互映射,那么满足条件,continue;
如果它们不是相互映射的话,返回false。
最后在代码中添加判断pattern中的字符数和str中的字符串数不一样的情况,两种情况都是false。
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<char, string> m1;
map<string, char> m2;
int n = 0;
for(int i = 0 ; i < pattern.length() ; i ++) {
if(n == str.length()) return false;
string s = getstr(str, n, str.length());
if(m2.find(s) == m2.end()&&m1.find(pattern[i]) == m1.end()) {
m1[pattern[i]] = s;
m2[s] = pattern[i];
}
else if(m1[pattern[i]] == s&&m2[s] == pattern[i]) ;
else return false;
}
if(n == str.length()) return true;
return false;
}
string getstr(string s,int& n, int m){
string ret;
while(s[n] != ' '&&n != m){
ret += s[n];
n++;
}
if(n != m) n++;
return ret;
}
};