目录
一、题目描述
给定一种规律 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 包含了由单个空格分隔的小写字母。
二、解题思路
这道题考察哈希,但是考察的是映射里的双射。之前没有做过这类题,自己瞎写搞了好久…
双射:两个集合里的值一一映射。比如题目里的ch与string单词的映射,string单词与ch的映射就是双射关系。
虽然是简单题,双射还是要记录一下的。
三、代码实现
#include <bits/stdc++.h>
using namespace std;
bool wordPattern(string pattern, string s) {
int length = s.size();
vector<string> words;
string tmp = "";
for (int i = 0; i < length; ++i) {
if (s[i] != ' ') {
tmp += s[i];
}
if (s[i] == ' ' || i == length - 1) {
words.push_back(tmp);
tmp = "";
}
}
if (pattern.size() != words.size()) return false;
//学习双射这个概念
unordered_map<char, string> ch2str;
unordered_map<string, char> str2ch;
for (int i = 0; i < pattern.size(); i++) {
char ch = pattern[i];
if (ch2str.count(ch) && ch2str[ch] != words[i]) return false;
if (str2ch.count(words[i]) && str2ch[words[i]] != ch) return false;
ch2str[ch] = words[i];
str2ch[words[i]] = ch;
}
return true;
}
int main() {
string pattern = "abc";
string s = "dog cat dog";
cout << wordPattern(pattern, s) << " ";
return 0;
}