寻找最长不含有重复字符的子串
一、规则
二、实现
2.1、思路
变量:开始索引、map[字符]索引、最大长度
- 如果碰到map已经存在该字符的并且出现位置>=开始索引,将map中记录的位置的下一个位置当做开始索引
- 如果当前不重复区间大于记录最大长度保存到最大长度
- 将当前遍历到的字符索引保存到map[byte]int中,byte存放字符、int存放索引
2.2、go语言实现
2.2.1、ASSIC编码
package main
import "fmt"
func GetNoRepeatStringMaxLength(str string) int {
lastOccurred := make(map[byte]int)
start := 0
maxLength := 0
for i, ch := range []byte(str) {
if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
start = lastI + 1
}
if i-start+1 > maxLength {
maxLength = i-start+1
}
lastOccurred[ch] = i
}
return maxLength
}
func main() {
str := "abcbbdd"
maxLength := GetNoRepeatStringMaxLength(str)
fmt.Println(maxLength)
}
2.2.2、UTF-8编码
package main
import "fmt"
func GetNoRepeatStringMaxLength(str string) int {
lastOccurred := make(map[rune]int)
start := 0
maxLength := 0
for i, ch := range []rune(str) {
if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
start = lastI + 1
}
if i-start+1 > maxLength {
maxLength = i-start+1
}
lastOccurred[ch] = i
}
return maxLength
}
func main() {
str := "abcbbdd"
maxLength := GetNoRepeatStringMaxLength(str)
fmt.Println(maxLength)
}