日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode--3. 无重复字符的最长子串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個字符串,請你找出其中不含有重復字符的?最長子串?的長度。

示例?1:

輸入: "abcabcbb"
輸出: 3?
解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。
示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 因為無重復字符的最長子串是 "b",所以其長度為 1。
示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因為無重復字符的最長子串是?"wke",所以其長度為 3。
?? ? 請注意,你的答案必須是 子串 的長度,"pwke"?是一個子序列,不是子串。

思路:

如果直接使用暴力法,時間復雜度將會是o(n^3),不可取,也無法通過案例測試

雙指針法,使用滑動窗口

在暴力法中,我們會反復檢查一個子字符串是否含有有重復的字符,但這是沒有必要的。

我們可以設定左右邊界,i為左邊界,j為右邊界,j從0開始向右移動,當遇到重復元素時,j開始向右移動,將與該元素重復的那個元素之間的元素都去掉,之后,j繼續移動。

例如:abcbdbb

初始:i=0,j=0

j開始向右移動,i=0,j=2,現在長度為3

j繼續移動,j=3,發現有重復元素,那么i開始移動

先去掉a,發現重復元素還在,繼續移動去掉第一個b元素,現在沒有重復元素,我們可以繼續向下走了

此時,i=2,j=3

那么如何去掉重復元素呢?

Java中提供了set,他可以幫助我們很好的去重

提交的代碼:

class Solution {
? ? public int lengthOfLongestSubstring(String s) {
? ? ? ? int n =s.length();
?? ?int i=0,j=0,sum=0,max=0;
?? ?Set<Character> set = new HashSet<>();
? ? while(i<n&&j<n)
? ? {
? ? ?? ?if(set.contains(s.charAt(j))==false)
? ? ?? ?{
? ? ?? ??? ?set.add(s.charAt(j));
? ? ?? ??? ?j++;
? ? ?? ??? ?sum+=1;
? ? ?? ?}
? ? ?? ?else
? ? ?? ?{
? ? ?? ??? ?set.remove(s.charAt(i));
? ? ?? ??? ?i++;
? ? ?? ??? ?sum-=1;
? ? ?? ?}
? ? ?? ?max = java.lang.Math.max(max, sum);
? ? }
? ? return max;
? ? }
}

完整的代碼:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Solution3 {
public static int lengthOfLongestSubstring(String s) {
?? ?int n =s.length();
?? ?int i=0,j=0,sum=0,max=0;
?? ?Set<Character> set = new HashSet<>();
? ? while(i<n&&j<n)
? ? {
? ? ?? ?if(set.contains(s.charAt(j))==false)
? ? ?? ?{
? ? ?? ??? ?set.add(s.charAt(j));
? ? ?? ??? ?j++;
? ? ?? ??? ?sum+=1;
? ? ?? ?}
? ? ?? ?else
? ? ?? ?{
? ? ?? ??? ?set.remove(s.charAt(i));
? ? ?? ??? ?i++;
? ? ?? ??? ?sum-=1;
? ? ?? ?}
? ? ?? ?max = java.lang.Math.max(max, sum);
? ? }
? ? return max;
? ? }
public static void main(String[] args)
{
?? ?Scanner sc = new Scanner(System.in);
?? ?String s;
?? ?s = sc.nextLine();
?? ?System.out.println(lengthOfLongestSubstring(s));
}
}
?

總結

以上是生活随笔為你收集整理的Leetcode--3. 无重复字符的最长子串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。