前言
今天开启新板块--哈希表,回顾总结了一下链表,时间原因,只写了一道题,明天还需完善。
内容
一、有效的字母异位词
给定两个字符串 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)
}
最后
基础知识还需完善,很多地方不知道,得找个小本本记下来了。今天就先这样吧。