LeetCode 面试经典 150_哈希表_单词规律(41_290_C++_简单)
题目描述:
给定一种规律 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、具体思路如下:
判断 pattern 中的字符c 与 s中对应的字符串 str 是否对应。
①、c 之前存在映射关系
之前的映射关系与 c:str 相同,继续判断pattern中剩余字符
之前的映射袁旭与 c:str 不同,返回false
②、c 之前不存在映射关系
str 不存在之前的映射关系中,建立映射关系 c:str
str 存在之前的映射关系中,返回false
2、复杂度分析:
① 时间复杂度:O(n + m),其中n是字符串s的长度,m是pattern的长度。在循环中使用ss >> str因此整个字符串的处理是O(n),遍历pattern中的每个字符进行匹配O(m)。
② 空间复杂度:O(n + m),stringstream的消耗和需要存储pattern中的字符映射和s中的单词。
代码实现
代码实现(思路一(哈希表)):
class Solution
{
public:
bool wordPattern(string pattern, string s) {
stringstream ss(s);
// 使用stringstream将输入字符串s分割成单词
unordered_map<
char, string> mp;
// 用于存储字符和单词的映射关系
unordered_set<string> set;
// 用于检查一个单词是否已经被映射
string str;
for (int i = 0; i < pattern.size(); i++) {
// 遍历pattern中的每个字符
ss >> str;
// 从stringstream中读取一个单词
if (mp.count(pattern[i])) {
// 如果当前字符已经有映射
if (mp[pattern[i]] != str) {
// 检查当前字符映射的单词是否与当前单词相同
return false;
// 如果不同,则返回false
}
} else {
if (set.count(str)) {
// 如果当前单词已经被其他字符映射过
return false;
// 如果是重复的单词,返回false
}
mp[pattern[i]] = str;
// 为当前字符创建一个新的映射关系
set.insert(str);
// 将当前单词添加到set中,确保它不会被重复映射
}
}
if (ss >> str) return false;
// 如果在读取完所有pattern字符后仍有剩余的单词,则返回false,表示长度不匹配
return true;
// 如果所有检查都通过,返回true
}
};
以思路一为例进行调试
#include<iostream>
#include<unordered_map>
#include<unordered_set>
#include<sstream>
using namespace std;
class Solution
{
public:
bool wordPattern(string pattern, string s) {
stringstream ss(s);
// 使用stringstream将输入字符串s分割成单词
unordered_map<
char, string> mp;
// 用于存储字符和单词的映射关系
unordered_set<string> set;
// 用于检查一个单词是否已经被映射
string str;
for (int i = 0; i < pattern.size(); i++) {
// 遍历pattern中的每个字符
ss >> str;
// 从stringstream中读取一个单词
if (mp.count(pattern[i])) {
// 如果当前字符已经有映射
if (mp[pattern[i]] != str) {
// 检查当前字符映射的单词是否与当前单词相同
return false;
// 如果不同,则返回false
}
} else {
if (set.count(str)) {
// 如果当前单词已经被其他字符映射过
return false;
// 如果是重复的单词,返回false
}
mp[pattern[i]] = str;
// 为当前字符创建一个新的映射关系
set.insert(str);
// 将当前单词添加到set中,确保它不会被重复映射
}
}
if (ss >> str) return false;
// 如果在读取完所有pattern字符后仍有剩余的单词,则返回false,表示长度不匹配
return true;
// 如果所有检查都通过,返回true
}
};
int main(int argc, char const *argv[])
{
string pattern="abba";
string s="dog dog dog dog";
Solution s1;
if (s1.wordPattern(pattern,s)){
cout<<
"true"<<endl;
}else{
cout<<
"false"<<endl;
}
return 0;
}
LeetCode 面试经典 150_哈希表_单词规律(41_290)原题链接
欢迎大家和我沟通交流(✿◠‿◠)
浙公网安备 33010602011771号