blog

博客

View on GitHub

给定一个字符串,找出不含有重复字符的 最长子串 的长度。

示例:

给定 "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
}