哈希表 - 有效字母异位词

90 阅读2分钟

哈希表 - 有效字母异位词

这里我们以力扣242题为例,讲讲有效的字母异位词这道题如何解。

image.png

首先我们需要明确什么是异位词。简单理解来说就是两个字符串他们由个数相同的字符组成,唯一的区别就是字符的顺序不一样。 abcdeddabcde是异位词。abcabc也是异位词。

好,现在明确了异位词的原理,接下来就是如何解题了。

最先想到的方式就是,统计两个字符串中,每个字符出现的次数。对后进行对比字符出现的次数是否一致即可。只要有一个不一样,直接返回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类型的别名。

接下来我们用第二种方式,题目说了字符串都是由小写字母组成。所以我们可以这样

  1. 新建一个map,从az都代表一个质数。
  2. 对两个字符串分别做相乘操作,只要最后两个字符串的乘积相等就是异位词。
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
}