3.无重复字符的最长子串

一、思路:

(1)暴力法:遍历所有的字串,统计不含有重复字符的字串的最大长度

(2)滑动窗口法:选取(i,j]范围的元素,查看窗口右边的元素,如果元素不在窗口内,j向右移动一个;如果右边的元素在窗口中已经有了重复的值,把i移动到那个重复的值的地方。

二、代码(C++):

int lengthOfLongestSubstring(string s) {
       if(s.size()==0)    //排除空字符串情况
            return 0;
        unordered_map<char,int> m;    //用一个unordered_map存放元素
        int max_length=1;    //初始最大长度为1
        int i=-1;    //初始窗口左端值i为-1
        for(int j=0;j!=s.size();j++)
        {
            if(m.find(s[j])!=m.end())    //元素已经存在在unordered_map,进一步判断,如果m[s[j]]>i则元素在窗口中已经存在
                i=max(i,m[s[j]]);    //窗口左端移动到已存在的元素处
            max_length=max(max_length,j-i);    //最大长度等于窗口右端-左端
            m[s[j]]=j;    //将元素放入unordered_map
        }
        return max_length;    //返回最大值
    }

 

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务