一、例题

例:寻找最长不含有重复字符的子串

就是一个字符串中,里面的子字符串不重复的长度,最长是多少

比如:

abcddddaaa => abcd => 4
bbbbbbbbbbb => b => 1
package main

import "fmt"

func lengthOfNonRepeatingSubStr(s string) int {
    // 存储访问的字符串位置,可以用来判断当前访问的字符是否存在过和位置在哪里
    lastOccurred := make(map[byte]int)

    // 最长子字符串的开始位置
    start := 0

    // 最长子字符串的长度
    maxLength := 0

    for key, ch := range []byte(s) {
        // lastOccurred[ch] 存在且大于开始位置,重置start位置
        if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
            start = lastI + 1
        }

        if key-start+1 > maxLength {
            maxLength = key - start + 1
        }
        lastOccurred[ch] = key
    }

    return maxLength
}

func main() {
    fmt.Println(lengthOfNonRepeatingSubStr("abcabcaaa"))
    fmt.Println(lengthOfNonRepeatingSubStr("abc我们"))
}

运行输出

3
8

发现其实是中文的时候,是不准确的,因为中文正常是UTF-8编码(占用3个字节),
如何支持字符串,查看下一个章节《十四、go 字符串》