给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
思路:
1、遍历字符串,用一个字典dt key来存储每个元素的 , value是数字,用left变量存储子串的左端点,用right变量用来存储子串的右端点。
双指针法, left和right一前一后 , 遇到重复的就重新赋值left , 判断并存储最大长度值和当前的子串
go代码实现:
//最长无重复子串长度 //双指针法, left和right一前一后 , 遇到重复的就重新赋值left , 判断并存储最大长度值和当前的子串 //例如:输入 abcdefg 返回 abcdefg 7 ; 输入 abcacefga 返回 cefg 4 func LongestNorepeatSubstringLength(str string)(string,int){ strRune:=[]rune(str) left:=0 right:=0 maxNum:=0 m:=make(map[string]int) subStr:="" var flag =false //循环字符 for i,item:=range strRune{ key:=string(item) //right是当前索引 right=i //看看有没有出现过 if _,ok:=m[key];ok{ //如果有出现过,获取下长度 , right肯定是当前非重复子串的下一个元素了 num:=right-left //比最大值大的就替换 if num>maxNum{ subStr=string(strRune[left:right]) maxNum=num } //left赋值当前索引 left=i flag=true } //字符存到map m[key]=1 } //如果一次也没重复的,就再算一次 if !flag{ maxNum=right-left+1 subStr=string(strRune[left:right+1]) } return subStr,maxNum }