leetCode题3-无重复字符的最长子串

2020-09-05  本文已影响0人  GoSnail

给定一个字符串,请你找出启宗不含邮重复字符的最长字串的长度。

示例1:

输入:“abcacbbb”

输出:3

解释:因为无重复字符的最长字串是“abc",所以其长度为3.

示例2:

输入:“bbbbbb”

输出:1

解释:因为无重复字符的最长字串是“b”,所以其长度为1.

示例3:

输入:“pwwkew”

输出:3

解释:因为无重复字符的长度最长字串为“wke”,所以其长度为3.

请注意,你的答案必须是子串的长度,“pwke”是一个子序列,不是子串

絮叨一下:起初看这题没有看明白,什么是无重复字符的最长字串,看了第一个示例,我把该题理解扭曲了,以为是之前做过的在一个字符串中查找一个子串,这个子串在字符串中可重复出现,且该子串的最长长度是多少。这么理解,第一个示例完全符合,但是看完第二个示例和第三个示例,完全懵逼。。。。

后来琢磨了半天,才恍然大悟,是找一个子串,该子串中不出现重复的字符,找到长度最长的子串,然后返回该子串的长度。其实该题如果理解了他的本意,相对比较简单,至少比我误解的题要简单很多(后面是不是leetcode可以把我误解的题引入到题库里面啊,😄)

下面说下解题思路:

1、从字符串的头部开始,遍历字符串,让出现重复的字符时停止遍历,记录当前子串的长度。

2、在当前的子串中找到与当前遍历的字符重复的字符的位置,标记为i,然后新的遍历从i+1开始,继续遍历字符串

3、重读动作,每次记录子串的长度,每次产生新的子串后,求该子串的长度与上次一比较,如果小于则不做处理,如果大于则替换该数字。

4、遍历结束后,返回上面存储的数字,即为结果

下面附上代码:

func LeetCode3(sstring)int {

    var max =0

       var tmp string

       for _, v :=range s {

            if n :=strings.Index(tmp, string(v)); n != -1 {//在子串中找到了该字符。需要重新开始

               if max < len(tmp) {

                    max =len(tmp)

               }

            //将tmp的0-n的字符擦除

             tmp = tmp[n+1:]

        }

        tmp +=string(v)

    }

    return max

}

上一篇下一篇

猜你喜欢

热点阅读