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

示例 1:

[面试常问总结] 6. 无重复字符的最长子串_算法

 

 

 [面试常问总结] 6. 无重复字符的最长子串_面试常问_02

 

 

 [面试常问总结] 6. 无重复字符的最长子串_面试常问_03

 

 

 思路:

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
}

 

开源作品

GO-FLY,一套可私有化部署的免费开源客服系统,安装过程不超过五分钟(超过你打我 !),基于Golang开发,二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的网页在线客服系统,致力于帮助广大开发者/中小站长快速整合私有客服功能
github地址:go-fly