C++算法练习-day11——242.有效的字母异位词

题目来源:. - 力扣(LeetCode)

题目描述

题目要求判断两个字符串 s 和 t 是否为字谜(Anagram)。字谜指的是两个字符串包含相同数量的相同字符,只是字符的顺序可能不同。例如,"listen" 和 "silent" 是字谜,而 "hello" 和 "world" 不是。

思路分析

  1. 长度检查:首先,如果两个字符串的长度不同,它们一定不是字谜。因此,第一步是检查字符串的长度是否相等。

  2. 字符计数:如果长度相等,我们可以使用一个固定大小的数组(或哈希表)来记录每个字符出现的次数。由于题目没有指明字符集,我们可以假设只包含小写字母('a' 到 'z')。

  3. 增减计数:遍历字符串 s,对每个字符的计数加一;遍历字符串 t,对每个字符的计数减一。如果两个字符串是字谜,那么最后所有字符的计数都应该为零。

  4. 检查结果:最后,检查计数数组是否全部为零。

代码实例

#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;  
}


知识点摘要

  1. 字符串长度检查:判断两个字符串是否等长的基本方法。

  2. 字符计数:使用固定大小的数组或哈希表来记录字符出现的次数,这种方法在处理字符集固定且范围较小的情况时非常高效。

  3. 数组索引计算:通过字符的ASCII值减去某个基准值(如'a'的ASCII值)来计算数组索引,是一种常用的字符映射技巧。

  4. 遍历与计数:通过遍历字符串并对字符进行计数,是处理字符串问题的常用方法。

这种方法的时间复杂度为O(n),其中n是字符串的长度,因为我们只遍历了两个字符串各一次。空间复杂度为O(1),因为我们使用了固定大小的数组(26个字母)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neophyte0608

你的鼓励将使我创作学的更加快乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值