LeetCode 面试经典 150_哈希表_有效的字母异位词(42_242_C++_简单)
LeetCode 面试经典 150_哈希表_有效的字母异位词(42_242_C++_简单)
- 题目描述:
- 输入输出样例:
- 题解:
- 解题思路:
- 思路一(哈希表):
- 思路二(使用数组模拟哈希表):
- 代码实现
- 代码实现(思路一(哈希表)):
- 代码实现(思路二(使用数组模拟哈希表)):
- 以思路一为例进行调试
题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。
输入输出样例:
示例 1:
输入:s = “anagram”, t = “nagaram”
输出:true
示例 2:
输入:s = “rat”, t = “car”
输出:false
提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母
题解:
解题思路:
思路一(哈希表):
1、使用哈希表统计每个字母出现的次数。如果是 s 中出现的字母则增加该字母出现次数,如果是 t 中出现的字母则减小该字母出现的次数,若最终每个字符对应的次数为 0 则为有效的字母异位词。
2、复杂度分析:
① 时间复杂度:O(n),其中 n 为 s 的长度。
② 空间复杂度:O(S),其中 S 为字符集大小,此处 S=26。
思路二(使用数组模拟哈希表):
1、使用一个包含 26 和空间的数组来存储字母出现的次数。
a 对应下标 0
z 对应下标 25
2、复杂度分析:
① 时间复杂度:O(n),其中 n 为 s 的长度。
② 空间复杂度:O(S),其中 S 为字符集大小,此处 S=26。
代码实现
代码实现(思路一(哈希表)):
class Solution1 {
public:// 定义函数 isAnagram,判断两个字符串 s 和 t 是否为字母异位词bool isAnagram(string s, string t) {// 如果两个字符串的长度不同,直接返回 falseif (s.size() != t.size()) {return false;}// 使用 unordered_map 来记录字符的频次unordered_map<char, int> mp_s;// 遍历两个字符串for (int i = 0; i < s.size(); i++) {// 对 s 中的字符进行频次增加mp_s[s[i]]++;// 对 t 中的字符进行频次减少mp_s[t[i]]--;}// 遍历 unordered_map,检查每个字符的频次是否为 0for (auto &c : mp_s) {// 如果某个字符的频次不为 0,说明两个字符串不是字母异位词if (c.second != 0) {return false;}}// 如果所有字符的频次都为 0,说明两个字符串是字母异位词,返回 truereturn true;}
};
代码实现(思路二(使用数组模拟哈希表)):
class Solution2 {
public:// 定义函数 isAnagram,判断两个字符串 s 和 t 是否为字母异位词bool isAnagram(string s, string t) {// 如果两个字符串的长度不同,直接返回 falseif (s.length() != t.length()) {return false;}// 创建一个大小为 26 的 vector,用来存储每个字母出现的次数// 这里我们假设输入字符串只包含小写字母 a-zvector<int> table(26, 0);// 遍历字符串 s,更新每个字符的频次for (auto& ch : s) {table[ch - 'a']++; // 将字符 ch 对应的频次加 1}// 遍历字符串 t,更新每个字符的频次for (auto& ch : t) {table[ch - 'a']--; // 将字符 ch 对应的频次减 1// 如果某个字符的频次小于 0,说明 t 中的该字符出现次数超过了 s 中的次数if (table[ch - 'a'] < 0) {return false; // 说明不是字母异位词,返回 false}}// 如果所有字符的频次都正确(即频次为 0),则返回 true,说明两个字符串是字母异位词return true;}
};
以思路一为例进行调试
#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;class Solution1 {
public:// 定义函数 isAnagram,判断两个字符串 s 和 t 是否为字母异位词bool isAnagram(string s, string t) {// 如果两个字符串的长度不同,直接返回 falseif (s.size() != t.size()) {return false;}// 使用 unordered_map 来记录字符的频次unordered_map<char, int> mp_s;// 遍历两个字符串for (int i = 0; i < s.size(); i++) {// 对 s 中的字符进行频次增加mp_s[s[i]]++;// 对 t 中的字符进行频次减少mp_s[t[i]]--;}// 遍历 unordered_map,检查每个字符的频次是否为 0for (auto &c : mp_s) {// 如果某个字符的频次不为 0,说明两个字符串不是字母异位词if (c.second != 0) {return false;}}// 如果所有字符的频次都为 0,说明两个字符串是字母异位词,返回 truereturn true;}
};int main(int argc, char const *argv[])
{string s="anagram";string t="nagaram";Solution1 s1;if (s1.isAnagram(s,t)){cout<<"true"<<endl;}else{cout<<"false"<<endl;}return 0;
}
LeetCode 面试经典 150_哈希表_有效的字母异位词(42_242)原题链接
欢迎大家和我沟通交流(✿◠‿◠)