[LeetCode]day16 242.有效的字母异位词

发布于:2025-02-10 ⋅ 阅读:(62) ⋅ 点赞:(0)

242. 有效的字母异位词 - 力扣(LeetCode)

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

字母异位词的定义:


题解

解法一:排序

把字符串进行排序,比较两个字符串是否完全相同。如果完全相同就是字母异位词

class Solution {
public:
    bool isAnagram(string s, string t) {
      if(s.size()!=t.size())return false;
      sort(s.begin(),s.end());
      sort(t.begin(),t.end());
      return s==t;
    }
};

解法二:使用哈希表

当遇到要查询一个元素是否在集合中时,就要想当使用哈希表

当要使用哈希表时,要考虑三种数据结构 数组,set,map

在这道题中,我们使用普通数组来统计字符串s中每个字母出现的频率,比如:有一个a,就在0号位置上加1,有一个b,就在1号位置上加1

这个位置是怎么算出来的呢?

用该字母-‘a’ 得到的数 因为为自动转换为ASCII码值 ,'a'-'a'=0;'b'-'a'=1..

再统计字符串t中每个字母出现的频率,在hash数组中然后减去,比如:有一个a,就在0号位置上减1,有一个b,就在1号位置上减1

如果两个字符串的组成完全相同,那么所有字母出现的频率都应该相同

那么最终这个hash数组全部元素都应该为0

如果有地方不为0,那么说明这两个字符串组成不同

class Solution {
public:
    bool isAnagram(string s, string t) {
       int hash[26]={0};  //创建哈希表
       for(int i=0;i<s.size();i++){
        hash[s[i]-'a']++;
       } 
       for(int i=0;i<t.size();i++){
        hash[t[i]-'a']--;
       }
       for(int i=0;i<sizeof(hash)/sizeof(hash[0]);i++){
        if(hash[i]!=0)return false;
       }
       return true;
    }
};

易错点:
我在第一遍书写时,最后在遍历hash数组时,我直接写了hash.size(),这是一种错误的写法!

hash数组是一个原生数组,不是STL容器,没有size()方法,只能用sizeof(hash)/sizeof(hash[0])


网站公告

今日签到

点亮在社区的每一天
去签到