给定一种 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 包含了由单个空格分隔的小写字母。
这个题有些复杂,字符串操作的题总是有些复杂的,但是思路还是不难,就是用哈希表存储键值对,然后判断是不是有不同映射,如果有就是false。当哈希表中没有出现pattern字母时,还需要判断之前的值是否和当前str中的字符串有重叠,如果有就是false,如果没有重叠,那么就可以把当前的模式和字符串加入哈希表的键值中。当出现这个键时,如果其值与当前字符串不同,那么就是false。这里其实还有一个很重要的问题就是当pattern中的元素个数和str中的元素个数不同时一定要返回false,否则会导致一些边界溢出问题,这个问题在C++中不明显但是还是会有隐患,在python中会有测试样例出错。
C++源代码:
class Solution {
public:
bool wordPattern(string pattern, string str) {
int n = 0;
for(int i=0;i<str.length();i++)
{
if (str[i]==' ') n++;
}
if (pattern.length()!=n+1)
return false;
map<char, string> m;
istringstream in(str);
int i=0;
for (string word;in>>word;i++)
{
if (m.count(pattern[i])==0)
{
for(map<char,string>::iterator it=m.begin();it!=m.end();it++)
{
if (it->second==word) return false;
}
m[pattern[i]] = word;
}
else if (m[pattern[i]]!=word)
return false;
}
return i==pattern.length();
}
};
python3源代码:
class Solution:
def wordPattern(self, pattern, str):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
if len(pattern)!=len(str.split()):
return False
m = {}
i = 0
for word in str.split():
if pattern[i] not in m:
for key, value in m.items():
if value == word:
return False
m[pattern[i]] = word
elif m[pattern[i]]!=word:
return False
i += 1
return i==len(pattern)