哈希表 - 有效字母异位词
这里我们以力扣242题为例,讲讲有效的字母异位词这道题如何解。
首先我们需要明确什么是异位词。简单理解来说就是两个字符串他们由个数相同的字符组成,唯一的区别就是字符的顺序不一样。
abcded和dabcde是异位词。abc和abc也是异位词。
好,现在明确了异位词的原理,接下来就是如何解题了。
最先想到的方式就是,统计两个字符串中,每个字符出现的次数。对后进行对比字符出现的次数是否一致即可。只要有一个不一样,直接返回false
func isAnagram(s string, t string) bool {
if len(s) != len(t) {
return false
}
sMap := make(map[byte]int)
tMap := make(map[byte]int)
for i := 0; i < len(s); i++{
if _, ok := sMap[s[i]]; !ok {
sMap[s[i]] = strings.Count(s, string(s[i]))
}
if _, ok := tMap[t[i]]; !ok {
tMap[t[i]] = strings.Count(t, string(t[i]))
}
}
for k, v := range sMap{
if tMap[k] != v {
return false
}
}
return true
}
这种方式需要注意的点是:对字符串进行中括号取值,取到值的类型是byte类型,这是uint8类型的别名,通过for range对字符串进行操作,取到的值类型是rune,这是int32类型的别名。
接下来我们用第二种方式,题目说了字符串都是由小写字母组成。所以我们可以这样
- 新建一个
map,从a到z都代表一个质数。 - 对两个字符串分别做相乘操作,只要最后两个字符串的乘积相等就是异位词。
func isAnagram(s string, t string) bool {
if len(s) != len(t) {
return false
}
m := map[byte]int64{
'a': 2,
'b': 3,
'c': 5,
'd': 7,
'e': 11,
'f': 13,
'g': 17,
'h': 19,
'i': 23,
'j': 29,
'k': 31,
'l': 37,
'm': 41,
'n': 43,
'o': 47,
'p': 53,
'q': 59,
'r': 61,
's': 67,
't': 83,
'u': 89,
'v': 97,
'w': 101,
'x': 109,
'y': 113,
'z': 127,
}
sMul, tMul := int64(1), int64(1)
for i := 0; i < len(s); i++ {
sMul *= m[s[i]]
tMul *= m[t[i]]
}
return sMul == tMul
}
由于我们选用的是指数,如果字符串中字符出现的次数不相同的话,最后的乘积必然不可能是相等的。但是呢这个题解在力扣上不能通过,为什么,因为整型的长度超了。但也能作为一种解题思路。
下面是卡哥给的思路
func isAnagram(s string, t string) bool {
if len(s) != len(t) {
return false
}
m := make([]int, 26)
for i := 0; i < len(s); i++{
m[s[i] - 'a']++
m[t[i] - 'a']--
}
for i := 0; i < 26; i++{
if m[i] != 0 {
return false
}
}
return true
}