LeetCode:NO.242有效的字母异位词

题目链接

代码随想录

LeetCode

 

题目描述

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

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s 和 t 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

 

解题思路

本题是让判断两字符串是否为字母异位词,即两串中出现的字母次数是否相同。如 “hi” 和 “hii” 就不符合。

本题我们有两种思路解题,一种是将两串中的元素进行排序,然后依次比较;另一种就要用到哈希表的知识。

哈希表有三种常见的结构:

数组

set(集合

map(映射)

在这里,我们选择数组,因为串的字母组成较少,只有26个,我们只需定义大小为26的int数组即可。

首先判断两串的长度是否相等,若不相等,则必定不满足题意,返回false。

再依次遍历两个串中的每个元素:

hash[s[i]-'a']++ ,这句代码的意思是将串s的第i个位置上的字母的ASCII值与a做差值然后作为数组下标传给hash数组。若第一个字母为a则hash[0]++;若为b,则hash[1]++。

hash[t[i]-'a']-- ,两个串同时遍历,遇到字母,一个对hash数组对应位置进行加操作,一个进行减操作。

当两个串遍历完后,若hash数组某一位置不为0,则说明两串有不相同的字母,即不满足字母异位词。

 

代码实现

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

 

posted @ 2022-12-05 08:56  Mr_宋先生  阅读(21)  评论(0编辑  收藏  举报