3. 无重复字符的最长子串 + 双指针 + 滑动窗口

题目来源

LeetCode_3

题目详情

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

相似题目

题解分析

方法一:暴力法

package com.walegarrett.interview;
/**
 * @Author WaleGarrett
 * @Date 2021/2/16 18:24
 */

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

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

/**
 * 方法一:使用暴力枚举法
 */
public class LeetCode_3 {
    public int lengthOfLongestSubstring(String s) {
        if(s==null)
            return -1;
        int len = s.length();
        int max = 0;
        for(int i=0; i<len; i++){
            Set<Character> set = new HashSet<>();
            set.add(s.charAt(i));
            for(int j=i+1; j<len; j++){
                if(set.contains(s.charAt(j))){
                    break;
                }else set.add(s.charAt(j));
            }
            max = Math.max(max, set.size());
        }
        return max;
    }
}

方法二:滑动窗口-双指针法

  • 相对于暴力法,双指针法不需要再每次循环时将set清空,而是将最左边的元素移除。
  • 第二层循环也是在原来set的基础上判断元素是否存在,如果不存在则进set。
/**
 * 方法二:双指针法
 */
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        Set<Character> set = new HashSet<>();
        int left = 0, right = 0;
        int maxsize = 0;
        while(left < n){
            while(right < n && !set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                right++;
            }
            set.remove(s.charAt(left));
            left++;

            maxsize = Math.max(maxsize, right - left + 1);
        }
        return maxsize;
    }
}
posted @ 2021-02-17 22:23  Garrett_Wale  阅读(79)  评论(0编辑  收藏  举报