leetcode-242有效字母异位词

题目

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

示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:

输入: s = “rat”, t = “car”
输出: false

说明:
你可以假设字符串只包含小写字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-anagram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

解决的方法有好多种,最容易想到的可以直接转换成字符数组,然后两个都排序挨个比较,排序可以选快排,这种思路,时间复杂度nlogn。

第二种思路是使用定长的数组作为hash表。

一个重要的前提“假设两个字符串只包含小写字母”,小写字母一共也就 26 个,因此:

可以利用一个长度为 26 的字符数组(初始化为0)来统计每个字符串中小写字母出现的次数,然后再对比是否相等;

将出现在字符串 s 里的字符个数加 1,而出现在字符串 t 里的字符个数减 1,最后判断字符数组中是否都为 0。如果不为0返回false,否则返回true。

按上述操作,可得出结论:s 和 t 互为字母异位词。

记得首先判断s和t的长度是否相等,如果不等。可以直接返回false,就免得去执行下面的操作。

第二种思路时间复杂度是O(n),空间复杂度是O(1)。

代码

class Solution {
public:
    bool isAnagram(string s, string t) {
        int num[26]={0};
        if(s.length()!=t.length()){
            return false;
        }
        for(int i=0; i<s.length();i++){
            num[s[i]-'a']++;
             num[t[i]-'a']--;
        }
        for(int i=0; i<26;i++){
            if(num[i]!=0){
                return false;
            }
        }
        return true;
    }
};
原文地址:https://www.cnblogs.com/dataoblogs/p/14121881.html