Leetcode-290-单词规律
题目链接
题目描述
给定一种规律 pattern 和一个字符串 str , 判断 str 是否遵循相同的规律。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例2:
输入: pattern = "abba", str = "dog dog dog dog"
输出: false
要求
O(n) 时间复杂度
思路
(为什么这题的分类是简单....真的是我太笨了吗😭)
-
一开始想到用 一个 hashMap 记录 p 中每个字符对应的 str 。
当如上示例2 是过不了的。
因为这样的话 a 对应的是 dog,
b 对应的也是 dag。 -
用 两个 hashMap
一个 Map 记录 p 中每个字符对应的 str
另一个 Map 记录每个 str 对应 p 中的字符 -
遍历字符串,判断是否符合规律
当两个map都没记录时, 进行记录。
当只有一个有记录,另一个没有时(如示例2的 b ),返回false
当都有记录,但当前的 p 和 str 与记录不对应时,返回false
C++代码
class Solution {
public:
bool wordPattern(string p, string s) {
vector<string> s1 =split(s, ' ');
int n1 = p.length();
int n2 = s1.size();
if (n1 != n2) return false;
unordered_map <char, string> mp1;
unordered_map <string, char> mp2;
for (int i = 0; i < n1; i++) {
if (mp1[p[i]] == "" && mp2.count(s1[i])==0) {
mp1[p[i]] = s1[i];
mp2[s1[i]] = p[i];
} else if (mp1[p[i]] == "" || mp2.count(s1[i])==0 || mp1[p[i]] != s1[i])
return false;
}
return true;
}
vector<string> split(string s, char c)
{
vector<string> ans;
string ts = "";
for (int i = 0; i < s.length(); i++) {
if (s[i] == c && ts.size()!= 0)
ans.push_back(ts), ts = "";
else
ts.push_back(s[i]);
}
if (ts != "") ans.push_back(ts);
return ans;
}
};