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. 无重复字符的最长子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华师 计算机系统 作业,华师网络学院作业
- 下一篇: 动态规划--Leetcode121.买卖