题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含'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)。