題目:請從字符串中找出一個最長的不包含重複字符的子字符串,計算該最長子字符串的長度。假設字符串中只包含'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)。