算法—leetcode—3

287 阅读1分钟

题目

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

案例1

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

案例2

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

案例3

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是“子串”的长度,"pwke" 是一个子序列,不是子串。

思路

  1. 循环扫描字符串每个字符,通过map记录每个字符及字符所在的位置
  2. 记录最开始的索引(index)位置,如果出现重复的字符则重置索引位置
  3. 使用局部变量(maxLen)保存当前最大长度

代码

func lengthOfLongestSubstring(s string) int {
	maxLen := 0
	data := map[rune]int{}
	// 索引位置
	index := 0
	for key, value := range s {
		// 校验是否存在过
		if item, ok := data[value]; ok {
			// 替换索引
			if item > index {
				index = item
			}
		}
		if key+1-index > maxLen {
			maxLen = key + 1 - index
		}
		data[value] = key + 1
		log.Printf("value:%d, index:%d\n", value, key+1)
	}
	return maxLen
}

参考

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/lo…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。