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代码:
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if (s.length !== t.length) return false
return s.split('').sort().join('') === t.split('').sort().join('')
};
解释: 类似于C语言的解法一。
知识点回顾: 无。