LeetCode 242:有效的字母异位词

LeetCode 242:有效的字母异位词 C语言题解

本文将详细解析 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;
}

代码逐行解析

函数实现部分

1. 判断字符串长度是否相等
int len1 = strlen(s), len2 = strlen(t);
if (len1 != len2) {
    return false;
}
  • 首先,分别获取两个字符串的长度。
  • 如果长度不相等,则直接返回 false,因为字母异位词的长度必定相同。
2. 使用数组记录字母出现次数
int map[26] = {0};
  • 使用一个长度为 26 的数组 map,记录字符串中每个字母的出现次数。
  • map[i] 对应字母 i + ′ a ′ i + 'a' i+a 的出现次数。
3. 遍历字符串 s s s 并记录计数
for (int i = 0; i < len1; i++) {
    map[s[i] - 'a'] += 1;
}
  • 遍历字符串 s s s,对每个字符 s [ i ] s[i] s[i]
    • 计算其相对于字符 'a' 的索引位置 s [ i ] − ′ a ′ s[i] - 'a' s[i]a
    • 对应位置的计数加 1 1 1
4. 遍历字符串 t t t 并抵消计数
for (int i = 0; i < len2; i++) {
    map[t[i] - 'a'] -= 1;
}
  • 遍历字符串 t t t,对每个字符 t [ i ] t[i] t[i]
    • 计算其相对于字符 'a' 的索引位置 t [ i ] − ′ a ′ t[i] - 'a' t[i]a
    • 对应位置的计数减 1 1 1
5. 检查计数数组是否所有元素为 0
for (int i = 0; i < 26; i++) {
    if (map[i] != 0) {
        return false;
    }
}
  • 遍历 map 数组,检查是否所有元素均为 0 0 0
  • 如果存在非零元素,说明两个字符串中某些字母的出现次数不相同,返回 false
6. 返回结果
return true;
  • 如果所有计数均为 0 0 0,说明 t t t s s s 的字母异位词,返回 true

主函数解析

测试用例 1
char s1[] = "anagram";
char t1[] = "nagaram";
  • 测试两个字符串 "anagram""nagaram" 是否为字母异位词。
测试用例 2
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;
}

总结

  1. 使用数组统计字母出现次数是一种高效的方法,时间复杂度为 O ( n ) O(n) O(n)
  2. 在主函数中,通过多组测试用例验证了代码的正确性。
  3. 对于字符串操作问题,熟悉字符编码和数组操作尤为重要。

希望这篇博客能帮助你理解 LeetCode 242 题的解决方案!

你可能感兴趣的:(LeeCode,leetcode,算法,职场和发展)