1. 程式人生 > 其它 >每日演算法-無重複字元的最長子串

每日演算法-無重複字元的最長子串

題目描述


給定一個字串s,請你找出其中不含有重複字元的 最長字串 的長度

示例1:

輸入:s = "abcabcbb"
輸出:3
解釋:無重複字元的最長字串是"abc",所以長度為3。

示例2:

輸入:s = "bbbbb"
輸出:1
解釋:無重複字元的最長字串是"b",長度為1。

示例3:

輸入:s = ""
輸出:0

解答詳情

思路:先理解清楚字串的子串和子陣列的概念,子串是連續的,子陣列可以不連續;該題本人根據ASCII碼,利用字元的ASCII碼記錄上一個字元出現的位置,若遇到相同的字元,則更新統計子串長度的起始位置,並記錄相應無重複字元子串的長度,獲取其最大值。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len = s.length();//字串長度
        if(len < 2) return len==1 ? 1 : 0;
        
        int[] preStrIdx = new int[128];//128位的ASCII碼
        //利用字元的ASCII碼記錄上一個字元出現的位置
        for(int i = 0 ; i < 128 ; i++)preStrIdx[i] = -1;//初始化
        
        int res = 0;
        int start = 0;
        for(int i = 0 ; i < len ; i++){
            int idx = s.charAt(i);//字元對應的ASCII碼
            start = Math.max(start,preStrIdx[idx]+1);//記錄開始的位置
            res = Math.max(res,i-start+1);
            preStrIdx[idx] = i;//更新上一個字元的位置
        }
        return res;
    }
}