力扣刷题第十三天--哈希表篇

前言

今天开启新板块--哈希表,回顾总结了一下链表,时间原因,只写了一道题,明天还需完善。

内容

一、有效的字母异位词

242.有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

哈希表

哈希表模块的题,当然用哈希表来写了。根据之前写过的哈希表,想到把s中出现过的字母加入哈希表,然后与t比较,但是题目要求出现次数也相同。

先判断长度是否相同,将ch作为键在hashTable哈希表中增加其计数。如果ch已经存在于hashTable中,则它的计数会增加1;如果它不存在,则会被创建并计数为1

键是rune类型(Unicode字符),值是int类型。大括号{}表示这是一个空哈希表,也就是说它没有任何键值对

func isAnagram(s string, t string) bool {
    if len(s)!=len(t){
        return false
    }
    hashTable:=map[rune]int{}

    for _,ch:=range s{
       hashTable[ch]++
    }
    for _,ch:=range t{
        hashTable[ch]--
        if hashTable[ch]<0{
            return false
        }
    }
return true
}

将ch的ASCII码值减去'a'的ASCII码值后得到的值作为索引,增加c1数组对应索引的值。由于英文字母的ASCII码值是连续的,因此减去'a'可以得到相对于'a'的偏移量。这样可以方便地统计字符串中每个字母的出现次数 

func isAnagram(s,t string)bool{
    var c1,c2 [26]int
    for _,ch:=range s{
        c1[ch-'a']++
    }
    for _,ch:=range t{
        c2[ch-'a']++
    }
    return c1==c2
}
排序 

 一是没想过其他解法,二是不知道字符串可以排序啊。嗯。排序后比较,思路+1.

将输入的字符串转换为字节切片([]byte),分别存储在变量 s1 和 s2 中。

使用 sort.Slice 函数对 s1 和 s2 进行排序。sort.Slice 函数接受一个切片和一个比较函数作为参数,并根据比较函数的定义对切片进行排序。这里比较函数的定义是 func(i, j int) bool { return s1[i] < s1[j] },它按照字节的ASCII码值进行升序排序。

比较排序后的 s1 和 s2,将它们转换为字符串(string(s1) 和 string(s2)),并比较这两个字符串是否相等。

func isAnagram(s,t string)bool{
    s1,s2:=[]byte(s),[]byte(t)
    sort.Slice(s1,func(i,j int)bool{return s1[i]<s1[j]})
    sort.Slice(s2,func(i,j int)bool{return s2[i]<s2[j]})
    return string(s1)==string(s2)
}

最后

基础知识还需完善,很多地方不知道,得找个小本本记下来了。今天就先这样吧。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值