leetCode题3-无重复字符的最长子串
给定一个字符串,请你找出启宗不含邮重复字符的最长字串的长度。
示例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
}