LeetCode-有效的字母异位词

题目描述:

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

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

思路:

1、可以用排序,然后再进行比较是否相同。不过再这个之前,可以先判断两个字符串长度是否相同,如果不同,可以直接返回false。

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

2、哈希表。因为涉及到字母,都是只包含26个字母,可以创建一个大小为26的数组

然后进行分别计算S字符串中字母的频率和T字符串中字母的频率,S增加,T减少,最后,如果计数器为0,那么说明两个字符串是字母异位词

或者可以先用计数器计算S,然后用T减少每个字母,如果任何时候计数器低于0,就知道T包含一个不在S中的额外字母,就可以立即返回False

Java

class Solution {
    public boolean isAnagram(String s, String t) {
        //如果我们s和 t 的长度不一样,则立即返回false
        if (s.length() != t.length()) {
            return false;
        }
        //只有26个字符大小
        int[] table = new int[26];
        //先用计数器表计算 s,然后用 t 减少计数器表中的每个字母的计数器。如果在任何时候计数器低于零,我们知道 t包含一个不在 s中的额外字母,并立即返回 FALSE
        for (int i = 0; i < s.length(); i++) {
            table[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            table[t.charAt(i) - 'a']--;
            if (table[t.charAt(i) - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
}

C 语言

bool isAnagram(char * s, char * t){
    if(strlen(s)!=strlen(t)) return false;
    int table[26]={};
    for(int i=0;i

C++

class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.size()!=t.size()){
            return false;
        }
        int table[26]={};
        for(int i=0;i

Python

直接调用使用内置模块collections中的Counter类

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        return collections.Counter(s) == collections.Counter(t)

 

 

你可能感兴趣的:(LeetCode,leetcode,字符串,java,哈希表,数据结构)