给定两个字符串 s
和 t
,编写一个函数来判断它们是不是一组变位词(字母异位词)。
注意:若 s
和 t
中每个字符出现的次数都相同且字符顺序不完全相同,则称 s
和 t
互为变位词(字母异位词)。
示例 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
andt
仅包含小写字母
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
注意:本题与主站 242 题相似(字母异位词定义不同):https://leetcode-cn.com/problems/valid-anagram/
数组或哈希表累加 s 中每个字符出现的次数,再减去 t 中对应的每个字符出现的次数。遍历结束后,若字符中出现次数不为 0 的情况,返回 false,否则返回 true。
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
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;
}
}
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;
}
};
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
}