题目链接: 有效的字母异位词
有关题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
提示:
1 <= s.length, t.length <= 5 * 10^4
s 和 t 仅包含小写字母
题解
法一:排序
参考官方题解
int cmp(const void *e1, const void *e2)
{
return *(char*)e1 > *(char*)e2;
}
bool isAnagram(char * s, char * t){
if (strlen(s) != strlen(t)) return false;
qsort(s, strlen(s), sizeof(char), cmp);
qsort(t, strlen(t), sizeof(char), cmp);
return strcmp(s, t) == 0;
}
法二:哈希表
struct hashTable {
int key;
int val;
UT_hash_handle hh;
};
bool isAnagram(char * s, char * t){
if (strlen(t) != strlen(s)) return false;
struct hashTable *freq = NULL;
for (int i = 0; i < strlen(s); i++)
{
int ikey = s[i];
struct hashTable *temp;
HASH_FIND_INT(freq, &ikey, temp);
if (NULL == temp)
{
temp = (struct hashTable*)malloc(sizeof(struct hashTable));
temp->key = ikey, temp->val = 1;
HASH_ADD_INT(freq, key, temp);
}
else
{
temp->val++;
}
}
for (int i = 0; i < strlen(t); i++)
{
int ikey = t[i];
struct hashTable *temp;
HASH_FIND_INT(freq, &ikey, temp);
if (NULL == temp) return false;
else if (temp->val <= 0) return false;
else temp->val--;
}
return true;
}