美文网首页
3.无重复字符的最长子串(C++)

3.无重复字符的最长子串(C++)

作者: codehory | 来源:发表于2019-08-01 15:56 被阅读0次

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

    示例 1:
    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    
    示例 2:
    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    
    示例 3:
    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    

    思路:滑动窗口

    建立一个256位大小的整型数组来代替哈希表,这样做的原因是ASCII表共能表示256个字符,所以可以记录所有字符,然后我们需要定义两个变量lenleft,其中len用来记录最长无重复子串的长度,left指向该无重复子串左边的起始位置,然后我们遍历整个字符串,对于每一个遍历到的字符,如果哈希表中该字符串对应的值为0,说明没有遇到过该字符,则此时计算最长无重复子串,i - left +1,其中是最长无重复子串最右边的位置,left是最左边的位置,还有一种情况也需要计算最长无重复子串,就是当哈希表中的值小于left,这是由于此时出现过重复的字符,left的位置更新了,如果又遇到了新的字符,就要重新计算最长无重复子串。最后每次都要在哈希表中将当前字符对应的值赋值为i+1

    解:

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            int table[256]={};
            int left=0,len=0;
            for(int i=0;i<s.size();i++){
                if(table[s[i]]==0||table[s[i]]<left){
                    len=max(len,i-left+1);
                }
                else{
                    left=table[s[i]];
                }
                table[s[i]]=i+1;
            }
            return len; 
        }
    };
    

    相关文章

      网友评论

          本文标题:3.无重复字符的最长子串(C++)

          本文链接:https://www.haomeiwen.com/subject/tzxcdctx.html