Sword Finger Offer Interview Frage 48: Die längste Teilzeichenfolge ohne wiederholte Zeichen (dynamische Programmierung, abstrakter)

Diese Frage besagt, dass dynamische Programmierung verwendet werden soll, ist aber eigentlich ziemlich abstrakt. Die dynamische Programmieridee dieses Problems besteht darin, die Funktion f (i) so einzustellen, dass sie die Länge des größten nicht wiederholten Teilstrings mit dem i-ten Buchstaben als letztem Zeichen darstellt. Gehen Sie erneut vorwärts, speichern Sie die Länge der Differenz zwischen dem letzten Vorkommen dieses Zeichens und dieser Zeit und klassifizieren und diskutieren Sie dann. Wenn diese Länge größer ist als die maximale Länge, die mit dem vorherigen Zeichen endet, bedeutet dies, dass die maximale Länge mit endet Das aktuelle Zeichen liegt über Ein Zeichen ist die maximale Länge des Endes plus eins. Wenn die Länge kleiner als die maximale Länge am Ende des vorherigen Zeichens ist. Dann ist die maximale Länge, die mit dem aktuellen Zeichen endet, die Länge der Differenz zwischen dem letzten Vorkommen dieses Zeichens und dem aktuellen Vorkommen.

 

 

 

 

 

 

 

    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;
    }

 

Ich denke du magst

Origin blog.csdn.net/qq_40473204/article/details/114585221
Empfohlen
Rangfolge