LeetCode-0003 无重复字符的最长子串

题目

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

示例 1:

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

示例 2:

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

示例 3:

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

请注意,你的答案必须是【子串】的长度,"pwke" 是一个子序列,不是子串。

思路分析

暴力破解的时间效率太差,不考虑。

设所给字符串的字符长度为 n,则符合要求的子串的首字符在原字符串中的下标的所有可能性为:0,1,……,n-1。依次遍历子串 [k, *),k = 0,1,……,n-1 即可。

解答

func lengthOfLongestSubstring(s string) int {
	chars := []rune(s)
	n := len(chars)
	if n == 0 {
		return 0
	}

	res := 1

	for i := 0; i < n; i++ {
		// 检查以 i 开头的字串是否唯一

		m := map[rune]int{}
		m[chars[i]] = i

		curr := 1 // 本次循环找到的最大长度

		for j := i + 1; j < n; j++ {
			if _, in := m[chars[j]]; in {
				break
			} else {
				m[chars[j]] = j
				curr++
			}
		}

		if curr > res {
			res = curr
		}
	}

	return res
}
posted @ 2020-02-22 14:59  风华神使  阅读(90)  评论(0)    收藏  举报