(哈希表)LeetCode题目:有效的字母异位词

题目描述:

给定两个字符串 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 * 104
  • s 和 t 仅包含小写字母

解题方法——哈希表法:

代码里的思路写的很详细了,这里不赘述.

//思路: 由于是26个小写字母,因此可以利用hash数组和其ASCII值解题.
//      先对s字符串处理,将其中的的每一个字符的ASCII值对应的数组元素进行+1处理
//      之后根据t字符串的元素,对hash数组中与元素ASCII值对应的元素进行-1处理
//      若最终得到的hash数组的每一位元素均为0,则true,否则为false
bool isAnagram(char* s, char* t) {
    //首先定义一个hash数组用来记录字符串出现的次数
    int hash[26];

    //先遍历s字符串
    for(int i=0; i<strlen(s) ;i++ )
    {
        hash[s[i]-'a']++;
    }

    //再遍历t字符串
    for(int j=0; j<strlen(t); j++)
    {
        hash[t[j]-'a']--;
    }

    //最后检查hash数组每一个元素是否都为0
    for(int i=0;i<26;i++)
    {
        if(hash[i]!=0)
            return false;
    }
    return true;
}

优化代码:

bool isAnagram(char* s, char* t) {
    //首先定义一个hash数组用来记录字符串出现的次数
    int hash[26];

    //先遍历s字符串
    while(*s)   //遍历字符串s,直到遇到空白字符
    {
        int i=0;
        hash[*s++-'a']++;
    }

    //再遍历t字符串
    while(*t)
    {
        int j=0;
        hash[*t++-'a']--;
    }

    //最后检查hash数组每一个元素是否都为0
    for(int i=0;i<26;i++)
    {
        if(hash[i]!=0)
            return false;
    }
    return true;
}

笔记:①while(*s)可以用于遍历字符串s,但别忘记使用*s++

        ②也可以通过s和t分别构建两个数组进行记录,之后使用memcmp函数对这两个数组进行比较       
         注意:memcmp 是一个标准库函数,用于比较内存区域。它定义在 <string.h> 头文件中。memcmp 函数比较由前两个参数指定的内存区域的前 n 个字节(第三个参数指定),并根据比较结果返回整数。memcmp 函数的原型如下:

int memcmp(const void *s1, const void *s2, size_t n);
  • s1 和 s2 是指向要比较的内存区域的指针。
  • n 是要比较的字节数。

返回值:

  • 如果 s1 和 s2 的前 n 个字节完全相同,则返回 0
  • 如果在前 n 个字节中,s1 小于 s2(根据无符号字符的二进制表示进行比较),则返回一个小于 0 的值。
  • 如果在前 n 个字节中,s1 大于 s2,则返回一个大于 0 的值。

注意,memcmp 并不是逐字符比较字符串(即不考虑字符串的终止符 '\0'),而是根据提供的字节数来比较内存区域。因此,它也可以用于比较非字符串的数据,如结构体或数组的一部分。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值