leetcode-242:有效的字母异位词

简介: leetcode-242:有效的字母异位词

题目:

题目链接

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

示例 1:

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

示例 2:

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

解题:

方法一:哈希表(i)

先把一个字符串的每个字符放入哈希表计数,再遍历另外一个字符串,每出现一次,就让哈希表对应的值减去一,如果没有可以减的了,就返回False

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s)!=len(t):
            return False
        hush = dict()
        for char in s:
            hush[char] = hush.get(char,0)+1
        for char in t:
            if char not in hush:
                return False
            else:
                if hush[char] == 0:
                    return False
                else:
                    hush[char] -=1
        return True

上面这个写法不太好,推荐使用下面的

在字符串s出现的字符数量+1,在字符串t出现的字符数量-1。最后判断,哈希表键对应的值都是0就代表有效的字母异位词。

python解法

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        hush = {}
        for c in s:
            hush[c] = hush.get(c,0)+1
        for c in t:
            hush[c] = hush.get(c,0)-1
        for key in hush.keys():
            if hush[key]!=0:
                return False
        return True

c++解法

利用数组当作哈希表

class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.length()!=t.length()){
            return false;
        }
        vector<int> table(26,0);
        for(char& c:s){
            table[c-'a']++;
        }
        for(char& c:t){
            table[c-'a']--;
            if(table[c-'a']<0){
                return false;
            }
        }
        return true;
    }
};

class Solution {
public:
    bool isAnagram(string s, string t) {
        vector<int> table(26);
        for(char& c:s){
            table[c-'a']++;
        }
        for(char& c:t){
            table[c-'a']--;
        }
        for(int i=0;i<26;i++){
            if(table[i]!=0){
                return false;
            }
        }
        return true;
    }
};

java解法

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] mp=new int[26];
        for(int i=0;i<s.length();i++){
            mp[s.charAt(i)-'a']++;
        }
        for(int i=0;i<t.length();i++){
            if(mp[t.charAt(i)-'a']==0) return false;
            else{
                mp[t.charAt(i)-'a']--;
            }
        }
        for(int i=0;i<26;i++){
            if(mp[i]>0) return false;
        }
        return true;
    }
}

更通用点

class Solution {
    public boolean isAnagram(String s, String t) {
        Map<Character,Integer> mp=new HashMap<Character,Integer>();
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            mp.put(c,mp.getOrDefault(c,0)+1);
        }
        for(int i=0;i<t.length();i++){
            char c=t.charAt(i);
            if(mp.getOrDefault(c,0)<=0) return false;
            mp.put(c,mp.getOrDefault(c,0)-1);
        }
        for(Map.Entry<Character,Integer> entry:mp.entrySet()){
            Character key=entry.getKey();
            Integer value=entry.getValue();
            if(value>0) return false;
        }
        return true;
    }
}

方法二:排序

python解法

如果排完序后的结果一样就说明是字母异位词

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if sorted(s)==sorted(t):
            return True
        return False

java

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length()) return false;
        char[] str1=s.toCharArray();
        char[] str2=t.toCharArray();
        Arrays.sort(str1);
        Arrays.sort(str2);
        return Arrays.equals(str1,str2);
    }
}

方法三:Counter计数器(i)

python解法

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if Counter(s)==Counter(t):
            return True
        return False

如果不适用Counter,就用普通的字典

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s)!=len(t):
            return False
        hush1 = dict()
        hush2 = dict()
        for i in range(len(s)):
            hush1[s[i]] = hush1.get(s[i],0)+1
            hush2[t[i]] = hush2.get(t[i],0)+1
        return hush1==hush2

因为字典是没有顺序的,只要里面的键值对相等,那么返回的就是True

相关文章
|
3月前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
21天前
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
13 1
|
21天前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
14 0
Leetcode第十七题(电话号码的字母组合)
|
21天前
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
13 0
【LeetCode 11】242.有效的字母异位词
|
20天前
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
28 0
|
3月前
|
算法
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
5月前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
|
5月前
|
存储 算法 安全
LeetCode 题目 49:字母异位词分组 5种算法实现与典型应用案例【python】
LeetCode 题目 49:字母异位词分组 5种算法实现与典型应用案例【python】
|
5月前
|
存储
力扣经典150题第四十二题:字母异位词分组
力扣经典150题第四十二题:字母异位词分组
30 0
|
5月前
|
存储
力扣经典150题第四十一题:有效的字母异位词
力扣经典150题第四十一题:有效的字母异位词
23 0