LeetCode 003. 无重复字符的最长子串 双指针

Posted itdef

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 003. 无重复字符的最长子串 双指针相关的知识,希望对你有一定的参考价值。

地址 https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

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

样例
示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

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

算法1
1 暴力遍历

2 双指针 依次遍历。 每次移动只需要计算移出的一个和进入的一个元素

3 todo 哈希记录字母出现最右索引 使用变量记录字符串的最左索引

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
      int ret = 0;

    do {
        if (s.size() <= 1) {
            ret = s.size();
            break;
        }

        map<char, int> mapChars;
        for (int i = 0; i < s.size(); i++) {
            for (int j = i; j < s.size(); j++) {
                if (mapChars[s[j]] != 0) {
                    break;
                }
                else {
                    mapChars[s[j]]++;
                }
            }

            if (mapChars.size() > ret) {
                ret = mapChars.size();
            }
            mapChars.clear();
        }
    } while (false);
    std::cout << ret << "
";
    return ret;    

    }
};

作者:defddr
链接:https://www.acwing.com/solution/LeetCode/content/3626/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:

    int leHash[256] = { 0 };
    int lengthOfLongestSubstring(string s) {
        int l = 0; int r = 0;
        int maxLen = 0;
        while (r < s.size()) {
            int lidx = s[l] ;
            int ridx = s[r] ;
            if (leHash[ridx] == 0) {
                leHash[ridx]++;
                if (maxLen < (r - l + 1)) 
                    maxLen = r - l + 1;
                r++;
            }
            else {
                while (leHash[ridx] != 0 && l <s.size()) {
                    leHash[lidx]--;
                    l++;
                    lidx = s[l] ;
                }
                leHash[ridx]++;
                if (maxLen < (r - l + 1))
                    maxLen = r - l + 1;
                r++;
            }

        }

        return maxLen;
    }



};


作者:defddr
链接:https://www.acwing.com/solution/LeetCode/content/3626/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

以上是关于LeetCode 003. 无重复字符的最长子串 双指针的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode--003--无重复字符的最长子串(java)

LeetCode 003. 无重复字符的最长子串 双指针

leetcode-003无重复字符的最长子串--python

leetcode-003无重复字符的最长子串--python

leetcode-003无重复字符的最长子串--python

Leetcode-003-无重复字符最长子串长度