算法練習(3)-尋找最大的不重復子串


要求:給定1個字符串,比如ababc,要求找出“第1個最長的不重復子串”,即:"abc"

思路:遍歷每個字符,尋找以它開頭的不重復子串,遍歷過程中,可以用一個Set作為緩沖區,存放曾經處理過的起始字符串。

過程:

(a)babc  -> 子串為a

(ab)abc  -> 子串為ab

(ab)abc  -> 發現重復字符a,准備從第2個字符開始新一輪查找

a(b)abc  -> 子串為b

a(ba)bc -> 子串為ba

a(ba)bc -> 發現重復字符b,准備從第3個字符開始新一輪查找

ab(a)bc -> 子串為a

ab(ab)c -> 子串為ab

ab(abc) -> 查找結束

 

代碼:

    /**
     * 查找最長不重復子串
     *
     * @param s
     * @return
     */

    public String getFirstLongestSubstring(String s) {
        System.out.println(s);
        char[] arr = s.toCharArray();
        Set<Character> set = new HashSet<>();
        int right = -1, maxLen = -1;
        String subStr = "";
        for (int i = 0; i < arr.length; i++) {
            if (i > 0) {
                //縮小左邊界
                set.remove(arr[i - 1]);
            }
            while (right + 1 < arr.length && !set.contains(arr[right + 1])) {
                set.add(arr[right + 1]);
                //擴大右邊界
                right++;
            }
            int len = right - i + 1;
            if (len > maxLen) {
                maxLen = len;
                char[] temp = new char[maxLen];
                s.getChars(i, right + 1, temp, 0);
                subStr = new String(temp);
            }
            if (maxLen >= arr.length - i) {
                break;
            }
        }
        return subStr;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM