242、有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
难度:简单 题目地址:https://leetcode-cn.com/problems/valid-anagram/
1、C语言代码:
int inc
(const void * a
,const void *b
){
return * (char * )a
-* (char *)b
;
}
bool
isAnagram(char * s
, char * t
){
int c1
=0,c2
=0;
for(int i
=0;s
[i
]!='\0';i
++){
c1
++;
}
for(int i
=0;t
[i
]!='\0';i
++){
c2
++;
}
qsort(s
,c1
, sizeof(char), inc
);
qsort(t
,c2
, sizeof(char), inc
);
if(c1
!=c2
)
return false
;
else
for(int i
=0;i
<=c1
;i
++){
if(s
[i
]!=t
[i
])
return false
;
}
return true
;
}
bool
isAnagram(char * s
, char * t
){
int n
=strlen(s
),m
=strlen(t
);
if(n
!=m
)
return false
;
int a
[26]={0};
for(int i
=0;i
<n
;i
++){
a
[s
[i
]-'a']++;
a
[t
[i
]-'a']--;
}
for(int i
=0;i
<26;i
++)
if(a
[i
]!=0)
return false
;
return true
;
}
解释: 解法一:排序。通过将 s 的字母重新排列成 t 来生成变位词。因此,如果 T 是 S 的变位词,对两个字符串进行排序将产生两个相同的字符串。此外,如果 s 和 t 的长度不同,t 不能是 s 的变位词,我们可以提前返回。 解法二:先判断两字符串长度是否相等,若不相等则false,若相等则将两字符串中每种字母的个数做差,若结果为0则true,不为0则false。
知识点回顾: 无。
2、Java代码:
class Solution {
public boolean isAnagram(String s
, String t
) {
if (s
.length() != t
.length()) {
return false;
}
int[] counter
= new int[26];
for (int i
= 0; i
< s
.length(); i
++) {
counter
[s
.charAt(i
) - 'a']++;
counter
[t
.charAt(i
) - 'a']--;
}
for (int count
: counter
) {
if (count
!= 0) {
return false;
}
}
return true;
}
}
解释:
为了检查 t 是否是 s 的重新排列,我们可以计算两个字符串中每个字母的出现次数并进行比较。因为 S 和 T 都只包含 A−Z 的字母,所以一个简单的 26 位计数器表就足够了。我们需要两个计数器数表进行比较吗?实际上不是,因为我们可以用一个计数器表计算 s 字母的频率,用 t 减少计数器表中的每个字母的计数器,然后检查计数器是否回到零。
知识点回顾: 哈希表的相关知识。
3、Python代码:
class Solution:
def isAnagram(self
, s
: str, t
: str) -> bool:
return sorted(s
) == sorted(t
)
解释: 类似于C语言的解法一。
知识点回顾: 无。
4、JavaScript代码:
var isAnagram = function(s
, t
) {
if (s
.length
!== t
.length
) return false
return s
.split('').sort().join('') === t
.split('').sort().join('')
};
解释: 类似于C语言的解法一。
知识点回顾: 无。