题目
- 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
示例
①示例1
- 输入: s = “anagram”, t = “nagaram”
- 输出: true
②示例2
- 输入: s = “rat”, t = “car”
- 输出: false
说明
你可以假设字符串只包含小写字母。
①数据范围
- 97 <= s[i] < 97+26
- 97 <= t[i] < 97+26
②相关话题
- 哈希表
- 排序
③相似题目
- 49. 字母异位词分组 — 力扣网
- 49. Group Anagrams — leetcode
- 438. 找到字符串中所有字母异位词 — 力扣网
- 438. Find All Anagrams in a String — leetcode
④题目地址
解题方法
只要 t 中和 s 中字符都一样、数目都一样,就可以了。
①哈希表
- 数据的浮动范围是 97 ~ 26+97,可用数组模拟的哈希表求解,速度最快(用空间换时间)。
- 用哈希表判断两个字符串中的字符出现次数是否一致。
- 时间复杂度:O(N)。
- 空间复杂度:O(N)。
②排序
- 先使用快排函数排序两个字符串,再通过字符串比较函数比较两者是否相等。
- 时间复杂度:O(Nlogn)。
- 空间复杂度:O(1)。
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
答:可以,若是使用哈希表方法,可以扩大哈希表范围,若是使用排序方法,上述排序解法也适用。
代码详解
- 哈希表
bool isAnagram(char* s, char* t) {
int hash[26] = {0}, len1 = strlen(s), len2 = strlen(t);
// 用哈希表判断两个字符串中的字符出现次数是否一致。
for (int i = 0; i < len1; i++)
hash[s[i]-'a']++;
for (int i = 0; i < len2; i++)
hash[t[i]-'a']--;
for (int i = 0; i < 26; i++) {
if (hash[i] != 0)
return false;
}
return true;
}
- 排序
// 快排函数(升序)。
int compare(const void* a, const void* b) {
return (*(char*)a)-(*(char*)b);
}
// 排序后再判断两字符串是否相等。
bool isAnagram(char* s, char* t) {
if (strlen(s) != strlen(t))
return false;
else {
qsort(s, strlen(s), sizeof(char), compare);
qsort(t, strlen(t), sizeof(char), compare);
if (strcmp(s, t) == 0)
return true;
else
return false;
}
}
附录
- 我的个人博客:messi1002.top
- 如有错误或疑惑之处 请联系 wjymessi@163.com
- 所有题目解答:fork me on github