算法學習之最長不含重複字符的子字符串

題目:請從字符串中找出一個最長的不包含重複字符的子字符串,計算該最長子字符串的長度。假設字符串中只包含'a'~'z'的字符。例如,在字符串"arabcacfr"中,最長的不含重複字符的子字符串是"acfr",長度爲4。

跟前兩道還是類似的 禮物的最大值把數字翻譯成字符串,動態規劃就完事了。嘿嘿

我們根據題意可推導出:

當字母未出現過:

1、f(i) = f(i-1)+1;

當字母在之前出現過時:

2、大於記錄的上一個最大值:f(i) = f(i-1)+1;

3、小於等於上一個記錄的最大值:f(i) = d;(d爲當前位置與該字母上次出現位置的差值)。

最後及時更新最大長度即可

 public int getMaxLength(String str) {

        if(TextUtils.isEmpty(str))return 0;

        int maxLength = 0;
        int preLength = 0; // 相當於f(i-1)
        int curLenght = 0; // 相當於f(i)
        int [] pointValue = new int[26];

        for (int i =0;i<str.length();i++){
            pointValue[i]=-1;
        }

        for (int i=0;i<str.length();i++){
            int index = str.charAt(i) - 'a';
            int curVaule = i - pointValue[index]; // 當前位置距離上次出現的差值
            if(pointValue[index]<0||curVaule>preLength) {
                curLenght = preLength+1;
            }else {
                curLenght = curVaule;
            }
            pointValue[index] = i;
            if(curLenght>maxLength) { // 紀錄最大值
                maxLength = curLenght;
            }
            preLength = curLenght;
        }
        return maxLength;
    }
  • 時間複雜度:O(n)。
  • 空間複雜度:O(1)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章