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
}

猜你喜欢

转载自www.cnblogs.com/jthmath/p/12345429.html