剑指Offer面试题48:最长不含重复字符的子字符串(动态规划,比较抽象)

这道题说是要用动态规划,其实比较抽象。这道题的动态规划思路是,设定函数f(i)代表以第i个字母为最后字符的最大不重复子串的长度。再向前遍历,保存这个字符上一次出现的位置与这次出现的差的长度,然后分类讨论,若这个长度大于以上一个字符为结尾的最大长度,说明以当前字符为结尾的最大长度是以上一个字符为结尾的最大长度加一。若这个长度小于以上一个字符为结尾的最大长度。则以当前字符为结尾的最大长度是这个字符上一次出现的位置与这次出现的差的长度。

    public int lengthOfLongestSubstring(String s) {
        char[] char_array = s.toCharArray();
        int[] length_array = new int[char_array.length];
        int max_num = 0;
        for(int count = 0;count<char_array.length;count++){
            length_array[count] = 0;
        }

        for(int count = 0; count<char_array.length;count++){
            if(count != 0){
                int count_inner = 1;
                for(;count_inner <= s.length();count_inner++){
                    if(count - count_inner < 0){
                        break;
                    }
                    if(char_array[count]==char_array[count-count_inner]){
                        length_array[count] = count_inner;
                        break;
                    }
                }


                if(count_inner<=length_array[count-1]){
                    length_array[count] = count_inner;
                }else{
                    length_array[count]=length_array[count-1] + 1;
                }
            }else{
                length_array[count] = 1;
            }
        }
        for(int count = 0;count<length_array.length;count++){
            if(length_array[count] > max_num){
                max_num = length_array[count];
            }
        }

        return max_num;
    }

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/114585221