给定一个字符串,找出不含有重复字符的 最长子串 的长度。
示例:
给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
给定 "pwwkew" ,最长子串是 "wke" ,长度是3。
请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。
第二版
搜索学习后 得到第二版
func lengthOfLongestSubstring(s string) int {
last, max, count := 1, 0, 0
m := [128]int{}
for index, value := range s {
if m[value] < last {
count += 1
} else {
last = m[value]
if count > max {
max = count
}
// 重点代码 当出现相同字母时 从不同字母处计数
count = index + 1 - last
}
m[value] = index + 1
}
if count > max {
max = count
}
return max
}
第一版
先通过循环得出有几个字母,不含有重复字符的最长子串
的长度必定小于字母数量
然后遍历获得 不含有重复字符的子串,并且得到长度, 然后和字母数量比较。
若是相等说明得到最长子串,直接返回。
package main
import (
"fmt"
)
func main() {
sum := lengthOfLongestSubstring("pwwkew")
fmt.Println(sum)
}
func lengthOfLongestSubstring(s string) int {
map1 := make(map[byte]int)
str_arr := make([]byte, len(s))
res := 0
for i := 0; i < len(s); i++ {
str_arr[i] = s[i]
map1[s[i]] = i
}
smlen := len(map1)
for range str_arr {
lew_arr := make(map[byte]int)
for k1, v1 := range str_arr {
if lew_arr[v1] != 0 {
break
}
lew_arr[v1] = k1
nsl := len(lew_arr)
if smlen == nsl {
return smlen
}
if nsl > res {
res = nsl
}
if res > len(str_arr) {
return res
}
}
str_arr = str_arr[1:]
}
return res
}