十三、go map 例题
一、例题
例:寻找最长不含有重复字符的子串
就是一个字符串中,里面的子字符串不重复的长度,最长是多少
比如:
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 字符串》