给定一种规律 pattern
和一个字符串 s
,判断 s
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 s
中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", s = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", s = "dog cat cat fish"
输出: false
示例 3:
输入: pattern = "aaaa", s = "dog cat cat dog"
输出: false
提示:
1 <= pattern.length <= 300
pattern
只包含小写英文字母1 <= s.length <= 3000
s
只包含小写英文字母和' '
s
不包含 任何前导或尾随对空格s
中每个单词都被 单个空格 分隔
思路:
1、istringstream,执行C++风格的串流的输入操作,他的功能是删除字符串开始的空格和末尾的空格,并以空格为分隔符将字符串分解为多个子字符串。
2、建立两个哈希表用来分别映射。
3、for循环遍历pattern中的每一个字符,(ss >> tmp)表示将ss(ss是存储s中以空格分开的子字符串)中字符串赋值给tmp,如果ss到达末尾则该表达式返回false否则返回true。
4、先判断是否匹配,即两个哈希表对应关系是否符合,不符合则直接返回false。否则分别构建哈希表对应关系。
5、最后根据字符串s是否赋值到最后来决定是返回true还是false。
代码实现:
class Solution {
public:
bool wordPattern(string pattern, string s) {
unordered_map<char, string>map1;
unordered_map<string, char>map2;
string tmp;
istringstream ss(s);
for(char c : pattern)
{
if(!(ss >> tmp) || (map1.count(c) == 1 && map1[c] != tmp) || (map2.count(tmp) == 1 && map2[tmp] != c))
return false;
map1[c] = tmp;
map2[tmp] = c;
}
return (ss >> tmp) ? false : true;
}
};