题目来源:. - 力扣(LeetCode)
题目描述
题目要求判断两个字符串 s 和 t 是否为字谜(Anagram)。字谜指的是两个字符串包含相同数量的相同字符,只是字符的顺序可能不同。例如,"listen" 和 "silent" 是字谜,而 "hello" 和 "world" 不是。
思路分析
-
长度检查:首先,如果两个字符串的长度不同,它们一定不是字谜。因此,第一步是检查字符串的长度是否相等。
-
字符计数:如果长度相等,我们可以使用一个固定大小的数组(或哈希表)来记录每个字符出现的次数。由于题目没有指明字符集,我们可以假设只包含小写字母('a' 到 'z')。
-
增减计数:遍历字符串
s,对每个字符的计数加一;遍历字符串t,对每个字符的计数减一。如果两个字符串是字谜,那么最后所有字符的计数都应该为零。 -
检查结果:最后,检查计数数组是否全部为零。
代码实例
#include <vector>
#include <string>
class Solution {
public:
bool isAnagram(std::string s, std::string t) {
// 如果两个字符串的长度不同,直接返回false
if (s.size() != t.size()) {
return false;
}
int n = s.size();
// 创建一个大小为26的数组,用于记录字符'a'到'z'的计数
std::vector<int> res(26, 0);
// 遍历字符串s,对每个字符的计数加一
for (int i = 0; i < n; i++) {
res[s[i] - 'a']++;
}
// 遍历字符串t,对每个字符的计数减一
for (int i = 0; i < n; i++) {
res[t[i] - 'a']--;
}
// 检查计数数组是否全部为零
for (int i = 0; i < 26; i++) {
if (res[i] != 0) {
return false;
}
}
// 如果所有字符的计数都为零,返回true
return true;
}
};
主函数:
#include <iostream>
int main() {
Solution sol;
std::string s = "listen";
std::string t = "silent";
if (sol.isAnagram(s, t)) {
std::cout << s << " 和 " << t << " 是字谜。" << std::endl;
} else {
std::cout << s << " 和 " << t << " 不是字谜。" << std::endl;
}
return 0;
}
知识点摘要
-
字符串长度检查:判断两个字符串是否等长的基本方法。
-
字符计数:使用固定大小的数组或哈希表来记录字符出现的次数,这种方法在处理字符集固定且范围较小的情况时非常高效。
-
数组索引计算:通过字符的ASCII值减去某个基准值(如'a'的ASCII值)来计算数组索引,是一种常用的字符映射技巧。
-
遍历与计数:通过遍历字符串并对字符进行计数,是处理字符串问题的常用方法。
这种方法的时间复杂度为O(n),其中n是字符串的长度,因为我们只遍历了两个字符串各一次。空间复杂度为O(1),因为我们使用了固定大小的数组(26个字母)。
120

被折叠的 条评论
为什么被折叠?



