請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含a~z的字元。例如,在字串「arabcacfr」中,最長的不含重複字元的子字串是「acfr」,長度為4。
我們定義函式f(i)表示以第i個字元為結尾的,不包含重複字元的子字串的最長長度。我們從左到右逐一掃瞄字串中的每個字元。當我們計算第i個字元為結尾的不包含重複字元的子字串的最長長度f(i)時,已經知道f(i-1)了。
如果第i個字元之前沒有出現過,那麼f(i)=f(i-1)+1。例如,在字串「arabcacfr」中,顯然f(0)=1,在計算f(1)時,下標為i的字串r之前沒有出現骨偶,因此f(1)=f(0)+1=2。繼續向後遍歷。
如果第i個字元之前出現過,情況就要複雜一點了。先計算第i個字元和它上次出現在字串中的位置的距離,記為d,分兩種情況討論。
第一種情況:如果d≤f(i-1),此時第i個字元出現在f(i-1)的最長子字串中,因此f(i)=d。此時第i個字元出現兩次所夾的子字串中再也沒有其他重複字元。再來看f(2),下標為2的字元是a,在前面出現過,上一次是下標為0的位置,此時d=2-0=2,上次重複的字元在f(1)對應的最長不含重複子字串中,所以f(2)=d=2,對應最長不含重複字元的子字串是「ra」。
第二種情況:如果d>f(i-1),此時第i個字元上次出現在f(i-1)對應的最長不包含重複字元的子字串之前,因此f(i)=f(i-1)+1。接著以字串「arabcacfr」分析,求最後乙個字元r為結尾的最長不包含重複字元的子字串的長度,即求f(8),可以知道f(7)對應的最長不含重複子字串是「acf」,f(7)=3,再去找上一次r出現的位置,發現在下標為1的位置,此時d=8-1=7>f(7)。上乙個字元r不在f(7)對應的字串「acf」中,此時把r直接拼接到「acf」後面也不會出現重複字元,因此f(8)=f(7)+1=4,對應最長不含重複字元的子字串是「acfr」。
package com.wsy;
public class main
public static void getlongestsubstringwithoutduplication(char chars)
int currentlength = 0;
int maxlength = 0;
for (int i = 0; i < length; i++) else
position[chars[i] - 'a'] = i;
if (currentlength > maxlength)
}system.out.println("最長不包含重複字元的子字串長度是" + maxlength);
}}
面試題48 最長不含重複字元的子字串
題目描述 請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pw...
面試題48 最長不含重複字元的子字串
題目 請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。示例 示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 p...
面試題48 最長不含重複字元的子字串(C )
請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew ...