算法学习之最长不含重复字符的子字符串

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

 

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