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

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

 

题解:

1.一字符串

2.找出其中不含有重复字符的最长子串

3.返回长度

4.子串是连续的,任何字符

 

示例 1:

输入: "abcabcbb"

输出: 3 

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

 

解题思路:

(1)哈希表+双指针

  • 哈希表存放所有可输入字符,下标表示字符,值表示出现次数

  • 附设左右指针,遍历字符

  • 左指针指向子串左下标位置,右指针指向右下标位置,子串长度为:右指针 - 左指针 + 1

  • 遍历中,如果没有出现重复字符,右指针一直向后移动,左指针不变

  • 如果出现重复字符,右指针指向子串右位置。左指针移动到重复字符初次出现位置的下标位置

  • 在上述子串中总是比较出子串长度最长的值

(2)双指针

  • 左指针每次向后移动一个位置,而右指针向后移动直到出现重复字符为止,记录比较找到的子串长度取长度更长的子串

  • 左指针向后移动一个位置再重复以上过程,直到左指针到达串尾

C/C++题解:

class Solution {

public:

    int lengthOfLongestSubstring(string s) {

        if (s.length() == 0) return 0;

        vector<int> index(256, -1);//

        int L = 0, R = -1, res = 0;

        while(R + 1 < s.length()){

            R++;//遍历指针向后移动

            if(index[s[R]] != -1)//如果出现重复字符

                L = max(L, index[s[R]]+1);//左索引为当前最多重复次数

            index[s[R]] = R; //遍历到一个字符,字符出现次数记录在相应位置

            res = max(res, R - L + 1);}

            //没有重复字符,左指针不动,右指针一直后移,字符串长度即R-L+1

            //出现重复字符,右指针在当前元素位置,左指针移动到重复字符初次出现位置的下一位置

        return res;}};

Debug结果:

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

Java题解:

class Solution {

    public int lengthOfLongestSubstring(String s) {

        if (s == null || s.length() == 0) return 0;

        char[] chs = s.toCharArray();

        int[] index = new int[256];

        int L = 0, R = -1, res = 0;

        Arrays.fill(index, -1);

        while (R + 1 < s.length()) {

            R++;//遍历指针向后移动

            if(index[chs[R]] != -1) //如果出现重复字符

                L = Math.max(L, index[chs[R]]+1); //左索引为当前最多重复次数

            index[chs[R]] = R;

            res = Math.max(res, R - L + 1);}

            //没有重复字符,左指针不动,右指针一直后移,字符串长度即R-L+1

            //出现重复字符,右指针在当前元素位置,左指针移动到重复字符初次出现位置的下一位置

        return res;}}

Debug结果:

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

Python题解:

class Solution(object):

    def lengthOfLongestSubstring(self, s):

        """:type s: str:rtype: int"""

        if len(s) == 0: return 0

        index = {}

        L, res = 0, 0

        for R, ch in enumerate(s):

            if ch in index and index[ch] >= L:#如果出现重复字符

                L = index[ch]+1 #左索引为当前最多重复次数

            index[ch] = R #遍历到一个字符,字符出现次数记录在相应位置

            res = max(res, R - L + 1)

            #没有重复字符,左指针不动,右指针一直后移,字符串长度即R-L+1

            #出现重复字符,右指针在当前元素位置,左指针移动到重复字符初次出现位置的下一位置

        return res

Debug结果:

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

例题来自力扣网https://leetcode-cn.com/

针对思路二:

class Solution(object):

    def lengthOfLongestSubstring(self, s):

        """:type s: str:rtype: int"""

        if s == " ": return 1

        first = second = 0

        length = second - first

        while first < len(s):#左指针每次向后移动一个位置

            tmp = [] #临时结果容器,如果返回子串用处较大

            while second < len(s):#右指针

                if s[second] not in tmp:#无重复

                    tmp.append(s[second])

                    second = second + 1

                    length = max(length, len(tmp))

                else:#在里面说明有重复

                    second = first

                    break

            first += 1

        return length

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