提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、题目
- 二、力扣官方题解
- 1、排序
- 2、哈希表
- 三、文心一言解释
- 1、排序
- 2、哈希表
- 总结
前言
刚上研一,有人劝我好好学C++,当时用的不多就没学,现在毕业上班了。在此亡羊补牢了
在此感谢力扣和文心一言
一、题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
二、力扣官方题解
1、排序
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
};
2、哈希表
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
vector<int> table(26, 0);
for (auto& ch: s) {
table[ch - 'a']++;
}
for (auto& ch: t) {
table[ch - 'a']--;
if (table[ch - 'a'] < 0) {
return false;
}
}
return true;
}
};
三、文心一言解释
1、排序
以下是isAnagram函数的详细解释:
首先,函数检查两个字符串s和t的长度是否相等。如果不相等,它们显然不能是变位词,因此函数直接返回false。
if (s.length() != t.length()) {
return false;
}
接着,函数使用std::sort算法对字符串s和t中的字符进行排序。排序后,如果两个字符串是变位词,它们的字符序列应该相同。
sort(s.begin(), s.end());
sort(t.begin(), t.end());
最后,函数比较排序后的字符串s和t是否相等。如果相等,说明它们是变位词,函数返回true;否则,返回false。
return s == t;
2、哈希表
这段代码是另一个解决变位词问题的C++实现,使用了哈希表(在这个例子中是一个整数数组table)来记录每个字符的出现次数。与上一个解决方案相比,这种方法在时间复杂度和空间复杂度上都更加优化,因为它只需要一次遍历就可以完成判断。
以下是该代码的详细解释:
首先,函数检查两个字符串s和t的长度是否相等。如果不相等,它们不能是变位词,因此函数直接返回false。
if (s.length() != t.length()) {
return false;
}
接下来,函数创建了一个大小为26的整数数组table,用于记录26个小写英文字母出现的次数。初始时,数组的所有元素都被设为0。
vector<int> table(26, 0);
然后,函数遍历字符串s中的每个字符。对于每个字符,它将table中对应位置(字符 ‘a’ 到 ‘z’ 的ASCII码减去 ‘a’ 的ASCII码)的值加1,以记录字符出现的次数。
for (auto& ch: s) {
table[ch - 'a']++;
}
接着,函数遍历字符串t中的每个字符。对于每个字符,它将table中对应位置的值减1,表示字符的消耗。如果在此过程中table中对应位置的值小于0,说明字符ch在字符串t中出现的次数超过了字符串s中该字符的出现次数,因此s和t不能是变位词,函数返回false。
for (auto& ch: t) {
table[ch - 'a']--;
if (table[ch - 'a'] < 0) {
return false;
}
}
如果函数能够成功遍历完字符串t,并且没有返回false,那么说明s和t中的每个字符都恰好出现相同次数,因此它们是变位词,函数返回true。
return true;
这种方法通过减少不必要的操作(如排序)来提高了效率,特别是对于较长的字符串来说,这种方法的性能优势会更加明显。此外,它只使用了常数空间来存储字符频率表,因此空间复杂度也较低。
需要注意的是,这段代码使用了头文件中的sort函数和头文件中的string类。因此,在实际使用中,你需要在代码文件的开头包含这两个头文件。