【Leetcode刷题篇】leetcode3 无重复字符的最长子串

    科技2025-01-21  6

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

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

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

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

    解题思路: 本次一开始跟之前的两数之和的解法都用的hashmap来进行,不过个人方法写的不是很好,参考了一下题解。 解决思路应该是采用滑动窗口的办法,即hashmap+滑动窗口的思路

    package com.lcz.leetcode; import java.util.HashMap; import java.util.HashSet; import java.util.Set; /** * @author : codingchao * @date : 2020-10-07 20:46 * @Description: * 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 * * 示例 1: * * 输入: "abcabcbb" * 输出: 3 * 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 * 示例 2: * * 输入: "bbbbb" * 输出: 1 * 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 * 示例 3: * * 输入: "pwwkew" * 输出: 3 * 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 * 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 * 解题思路: * 滑动窗口 **/ public class leetcode3 { public int lengthOfLongestSubstring(String s) { // if (s==null){ // return 0; // } // if (s.length()==1){ // return 1; // } // // 定义一个 // HashMap<Character,Integer> hashMap = new HashMap<Character,Integer>(); // int maxLength = 0; // int tempLength = 0; // int indexFlag = 0; // // 对字符串进行遍历 // for (int i=0;i<s.length();i++){ // // 已存在该字符 // if (hashMap.containsKey(s.charAt(i))){ // indexFlag = hashMap.get(s.charAt(i)); // hashMap.clear(); // tempLength = 0; // i = indexFlag ; // continue; // } // hashMap.put(s.charAt(i),i); // tempLength += 1; // if (maxLength<tempLength){ // maxLength = tempLength; // } // } // return maxLength; // 第二种方法hashmap // if(s.length()==0) // return 0; // HashMap<Character,Integer> map = new HashMap<>(); // int max = 0; // int left = 0; // for (int i=0;i<s.length();i++){ // if (map.containsKey(s.charAt(i))){ // left = Math.max(left,map.get(s.charAt(i))+1); // } // map.put(s.charAt(i),i); // max = Math.max(max,i+1-left); // } // return max; // 第三种方法hashset Set<Character> set = new HashSet<>(); int n = s.length(); int right = -1; int max = 0; for (int i=0;i<n;i++){ if (i!=0){ set.remove(s.charAt(i-1)); } while (right+1<n&&!set.contains(s.charAt(right+1))){ set.add(s.charAt(right+1)); ++right; } max = Math.max(max,right-i+1); } return max; } public static void main(String[] args) { leetcode3 l = new leetcode3(); int length = l.lengthOfLongestSubstring("bbbbb"); System.out.println(length); } }
    Processed: 0.009, SQL: 8