Longest Substring without repeating Characters(12.5)

題意:給定一個字符串,找出最長不重複的子串。
思路1:貪心法。從左往右掃描,當遇到重複字母時,以上一個重複字母的index+1,作爲新的搜索起始位置,直至最後一個字母。
思路二:滾動數組法。維護一個hashset,兩個指針end和start。記錄當前遍歷的子串,具體見代碼。
代碼:

 package com.LongestSubstring_12_5;

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

public class LongestSubstring {
    //貪心計算
    public int calLength(String s){
        //記錄字符上次出現過的位置
        int[] last = new int [26];
        int start = 0;//記錄當前子串的起始位置
        for (int i = 0; i < last.length; i++) {
            last[i] = -1;
        }
        int max_len = 0;
        for(int i = 0 ; i < s.length() ; i++){
            if(last[s.charAt(i)-'a'] >= start){ 
                max_len = Math.max(max_len, i-start);
                start = last[s.charAt(i)-'a']+1;
            }
            last[s.charAt(i) - 'a'] = i;
        }
        return max_len;
    }

    //滾動窗口解法
    public int calLength2(String s){
        int start = 0;
        int end = 0;
        int max = 0; 
        HashSet<Character> set = new HashSet<>();
        while (end < s.length()) {
            if(set.contains(s.charAt(end))){
            max = Math.max(max, end-start);
            while (s.charAt(start) != s.charAt(end)) {
                set.remove(s.charAt(start));
                start++;
            }
                start++;
        }else 
            set.add(s.charAt(end));
            end++;
        }
        max = Math.max(max, end-start);
        return max;
}

    public static void main(String[] args) {
        String string = "qpxrjxkltzyx";
        LongestSubstring lSubstring = new LongestSubstring();
        System.out.println(lSubstring.calLength(string));
        System.out.println(lSubstring.calLength2(string));
    }
}
發佈了116 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章