Skip to content

Latest commit

 

History

History

剑指 Offer II 032. 有效的变位词

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

题目描述

给定两个字符串 st ,编写一个函数来判断它们是不是一组变位词(字母异位词)。

注意:若 st 中每个字符出现的次数都相同且字符顺序不完全相同,则称 st 互为变位词(字母异位词)。

 

示例 1:

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

示例 2:

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

示例 3:

输入: s = "a", t = "a"
输出: false

 

提示:

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

 

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

 

注意:本题与主站 242 题相似(字母异位词定义不同):https://leetcode-cn.com/problems/valid-anagram/

解法

数组或哈希表累加 s 中每个字符出现的次数,再减去 t 中对应的每个字符出现的次数。遍历结束后,若字符中出现次数不为 0 的情况,返回 false,否则返回 true。

Python3

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t) or s == t:
            return False
        n = len(s)
        chars = [0] * 26
        for i in range(n):
            chars[ord(s[i]) - ord('a')] += 1
            chars[ord(t[i]) - ord('a')] -= 1
        for c in chars:
            if c != 0:
                return False
        return True

Java

class Solution {
    public boolean isAnagram(String s, String t) {
        int n;
        if ((n = s.length()) != t.length() || (Objects.equals(s, t))) {
            return false;
        }
        int[] chars = new int[26];
        for (int i = 0; i < n; ++i) {
            ++chars[s.charAt(i) - 'a'];
            --chars[t.charAt(i) - 'a'];
        }
        for (int c : chars) {
            if (c != 0) {
                return false;
            }
        }
        return true;
    }
}

C++

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

Go

func isAnagram(s string, t string) bool {
    if len(s) != len(t) || s == t {
        return false
    }
    var chars [26]int
    for i := 0; i < len(s); i++ {
        chars[s[i]-'a']++
        chars[t[i]-'a']--
    }
    for _, c := range chars {
        if c != 0 {
            return false
        }
    }
    return true
}

...