哈希表以及哈希的应用
bool areAnagrams(const char *str1, const char *str2) {
if (str1 == NULL || str2 == NULL) return false;
int count1[256] = {0};
int count2[256] = {0};
while (*str1) {
count1[*str1++]++;
}
while (*str2) {
count2[*str2++]++;
}
for (int i = 0; i < 256; i++) {
if (count1[i] != count2[i]) return false;
}
return true;
}
这个函数 areAnagrams
判断两个字符串是否为变位词。它通过两个计数器数组 count1
和 count2
来记录每个字符在两个字符串中出现的次数,然后比较这两个数组是否相等。如果相等,则说明两个字符串是变位词;否则不是。
解释
初始化计数器数组:
int count1[256] = {0}; int count2[256] = {0};
这里定义了两个长度为 256 的数组,用于记录每个字符的出现次数。由于 ASCII 码最多有 256 个字符。
统计字符出现次数:
while (*str1) { count1[*str1++]++; }
遍历第一个字符串
str1
,并将每个字符的计数加到count1
数组中。统计第二个字符串的字符出现次数:
while (*str2) { count2[*str2++]++; }
同样遍历第二个字符串
str2
,并将每个字符的计数加到count2
数组中。比较两个计数器数组:
for (int i = 0; i < 256; i++) { if (count1[i] != count2[i]) return false; }
遍历两个计数器数组,如果发现任何一个字符的计数不相等,则返回
false
。返回结果:
return true;
如果所有字符的计数都相等,则返回
true
。
这个方法的时间复杂度是 O(n),其中 n 是字符串的长度,因为每个字符只被遍历了一次。空间复杂度是 O(1),因为两个计数器数组的大小是固定的(256)。