给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。
注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。
示例一:
输入:s="anagram",t="nagaram"
输出:true
示例二:
输入:s="rat",t="car"
输出:false
解法一:排序
t是s的异位词等价于两个字符串排序相等。因此我们可以对字符串s和t分别排序,看排序后的字符串是否相等即可判断。此外,如果s和t的长度不同,t必然不是s的异位词。
int cmp(const void* _a, const void* _b) {
char a = *(char*)_a, b = *(char*)_b;
return a - b;
}
bool isAnagram(char* s, char* t) {
int len_s = strlen(s), len_t = strlen(t);
if (len_s != len_t) {
return false;
}
qsort(s, len_s, sizeof(char), cmp);
qsort(t, len_t, sizeof(char), cmp);
return strcmp(s, t) == 0;
}
时间复杂度:O(nlogn)
空间复杂度:O(logn)
解法二:哈希表
从另一个角度考虑,t是s的异位表等价于两个字符串出现的种类和次数均相等。由于字符串只包含26个小写字母,因此我们可以维护一个长度为26的频次数组cnt,先遍历记录字符串s中字符出现的频次,然后遍历字符串cnt[i]<0,则说明t中存在一个不在s中的额外字符 返回false
bool isAnagram(char * s, char * t){
int cnt[26];memset (cnt,0,sizeof(int)*26);int len_s = strlen (s);int len_t = strlen (t);if (len_s!=len_t){return false;}for (int i=0;i<len_s;i++){cnt [s[i]-'a']++;}for (int i=0;i<len_t;i++){cnt [t[i]-'a']--;}for (int i=0;i<len_t;i++){if (cnt[t[i]-'a']<0){return false;}}return true;}时间复杂度:O(n)空间复杂度:O(n)
07-27
718
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountBlack.png)
04-22