本文将详细解析 LeetCode 242 题(有效的字母异位词)的 C 语言题解,并添加测试主函数,逐行讲解代码实现。
给定两个字符串 s s s 和 t t t ,编写一个函数来判断 t t t 是否是 s s s 的字母异位词。
以下是完整的代码实现:
#include
#include
#include
// 判断是否为字母异位词的函数
bool isAnagram(char* s, char* t) {
int len1 = strlen(s), len2 = strlen(t);
// 如果两个字符串长度不同,直接返回 false
if (len1 != len2) {
return false;
}
// 用一个长度为 26 的数组记录字母出现次数
int map[26] = {0};
// 遍历字符串 s,统计每个字母的出现次数
for (int i = 0; i < len1; i++) {
map[s[i] - 'a'] += 1; // 对应字母计数加 1
}
// 遍历字符串 t,抵消之前记录的字母计数
for (int i = 0; i < len2; i++) {
map[t[i] - 'a'] -= 1; // 对应字母计数减 1
}
// 检查 map 数组是否所有元素均为 0
for (int i = 0; i < 26; i++) {
if (map[i] != 0) {
return false; // 如果有非零值,说明字母计数不匹配
}
}
return true; // 所有字母计数匹配,返回 true
}
以下为添加的主函数,用于测试 isAnagram
函数的正确性:
int main() {
char s1[] = "anagram";
char t1[] = "nagaram";
char s2[] = "rat";
char t2[] = "car";
// 测试用例 1
if (isAnagram(s1, t1)) {
printf("\"%s\" and \"%s\" are anagrams.\n", s1, t1);
} else {
printf("\"%s\" and \"%s\" are not anagrams.\n", s1, t1);
}
// 测试用例 2
if (isAnagram(s2, t2)) {
printf("\"%s\" and \"%s\" are anagrams.\n", s2, t2);
} else {
printf("\"%s\" and \"%s\" are not anagrams.\n", s2, t2);
}
return 0;
}
int len1 = strlen(s), len2 = strlen(t);
if (len1 != len2) {
return false;
}
false
,因为字母异位词的长度必定相同。int map[26] = {0};
map
,记录字符串中每个字母的出现次数。map[i]
对应字母 i + ′ a ′ i + 'a' i+′a′ 的出现次数。for (int i = 0; i < len1; i++) {
map[s[i] - 'a'] += 1;
}
'a'
的索引位置 s [ i ] − ′ a ′ s[i] - 'a' s[i]−′a′。for (int i = 0; i < len2; i++) {
map[t[i] - 'a'] -= 1;
}
'a'
的索引位置 t [ i ] − ′ a ′ t[i] - 'a' t[i]−′a′。for (int i = 0; i < 26; i++) {
if (map[i] != 0) {
return false;
}
}
map
数组,检查是否所有元素均为 0 0 0。false
。return true;
true
。char s1[] = "anagram";
char t1[] = "nagaram";
"anagram"
和 "nagaram"
是否为字母异位词。char s2[] = "rat";
char t2[] = "car";
"rat"
和 "car"
是否为字母异位词。if (isAnagram(s1, t1)) {
printf("\"%s\" and \"%s\" are anagrams.\n", s1, t1);
} else {
printf("\"%s\" and \"%s\" are not anagrams.\n", s1, t1);
}
isAnagram
函数的返回值,输出对应的测试结果。#include
#include
#include
bool isAnagram(char* s, char* t) {
int len1 = strlen(s), len2 = strlen(t);
if (len1 != len2) {
return false;
}
int map[26] = {0};
for (int i = 0; i < len1; i++) {
map[s[i] - 'a'] += 1;
}
for (int i = 0; i < len2; i++) {
map[t[i] - 'a'] -= 1;
}
for (int i = 0; i < 26; i++) {
if (map[i] != 0) {
return false;
}
}
return true;
}
int main() {
char s1[] = "anagram";
char t1[] = "nagaram";
char s2[] = "rat";
char t2[] = "car";
if (isAnagram(s1, t1)) {
printf("\"%s\" and \"%s\" are anagrams.\n", s1, t1);
} else {
printf("\"%s\" and \"%s\" are not anagrams.\n", s1, t1);
}
if (isAnagram(s2, t2)) {
printf("\"%s\" and \"%s\" are anagrams.\n", s2, t2);
} else {
printf("\"%s\" and \"%s\" are not anagrams.\n", s2, t2);
}
return 0;
}
希望这篇博客能帮助你理解 LeetCode 242 题的解决方案!