面試題48 最長不含重複字元的子字串

2021-10-03 01:17:14 字數 1310 閱讀 8374

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含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 ...