ソードフィンガーオファーインタビュー質問48:文字が繰り返されていない最長の部分文字列(動的計画法、より抽象的な)

この質問は動的計画法を使用するように言っていますが、実際にはかなり抽象的なものです。この問題の動的計画法のアイデアは、関数f(i)を設定して、i番目の文字を最後の文字とする最大の繰り返されない部分文字列の長さを表すことです。もう一度前に進み、この文字の最後の出現と今回の差の長さを保存してから、分類して話し合います。この長さが前の文字で終わる最大長よりも大きい場合は、で終わる最大長を意味します。現在の文字が上にある1文字は、末尾の最大長に1を加えたものです。長さが前の文字の終わりの最大長より短い場合。その場合、現在の文字で終わる最大の長さは、この文字の最後の出現と現在の出現との差の長さです。

 

 

 

 

 

 

 

    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