最長不含重複字元的子字串

2021-09-26 02:42:37 字數 2107 閱讀 1909

題目:請從字串中找出乙個最長的不包含重複字元的子

字串,計算該最長子字串的長度。假設字串中只包

含『a』~『z』的字元。

例如,在字串「arabcacfr」中,最長的不含重複字元

的子字串是」acfr」,長度為 4。

分析:f(i)表示第i個字元為結尾的不包含重複字元的子字串的最大長度。

如果第i個字元之前沒有出現過,那麼f(i)=f(i-1)+1。例

如,在字串"arabcafr"中,顯然f(o)等於1。在計算f(1)

時,下標為l的字元』r』之前沒有出現過,因此f(1)等於2,

即f(1)=f(0)+1。到目前為止,最長的不含重複字元的子

字串是"ar"。

• 如果第i個字元之前已經出現過,那情況就要複雜一點了。

我們先計算第i個字元和它上次出現在字串中的位置的

距離,並記為d,接著分兩種情形分析。

第一種情形是d≤f(i-l),此時第i個字元上次出現在f(i-1)

對應的最長子字串之中,因此f(i)=d。同時這也意味著

在第i個字元出現兩次所夾的子字串中再也沒有其他重

復的字元了。我們繼續計算f(2),即以下標為2的字元

• 'a』為結尾的不含重複字元的子字串的最長長度。

• 「arabcafr」。我們注意到字元』a』在之前出現過,該字

符上一次出現在下標為0的位置,它們之間的距離d(i-

preindex)為2,也就是字元』a』出現在f(l)對應的最長不

含重複字元的子字串」ar」中,此時f(2)=d,即f(2)=2,

對應的最長不含重複字元的子字串是「ra」。

• 第二種情形是d大於f(i-1),此時第i個字元上次出現在

f(i-1)對應的最長子字串之前,因此仍然有f(i)=f(i-

1)+1。我們接下來分析以字串"arabcacfr"最後乙個字

符』r』為結尾的最長不含重複字元的子字串的長度,即

求f(8)。以它前乙個字元』f』為結尾的最長不含重複字元

的子字串是」acf」,因此f(7)=3。我們注意到最後一

個字元『r』之前在字串"arabcacfr"**曾經現過,上

一次出現在下標為1的位置,因此兩次出現的距離d(i-

preindex)等於7,大於f(7)。

• 這說明上乙個字元』r』不在f(7)對應的最長不含重複字元

的子字串"acf"中,此時把字元』r』拼接到」acf」的後

面也不會出現重複字元。

• 因此f(8)=f(7)+1,即f(8)=4,對應的最長不含重複字元

的子字串是」acfr」。

package helen.b;

public class undupstring

private static int undupstring(string str)

int max=1;

int f=new int[str.length()];

f[0]=1;//abcbabcarkbac

for(int i=1;if[i-1])else

if(max=0;i--)

b++;

}return 0;

}}

這個**不是最優的,

在查詢上乙個重複的字元時 ,

可以宣告乙個陣列,將字元作為索引,

陣列中的值為上一次該字元出現的位置,

這樣可以節省一次for迴圈。

使時間複雜度變為最優;

那個f[i]的陣列也可以優化;

package helen.b;

public class undupstring

private static int undupstring(string str)

int max=1;

int p=new int[26];

for(int i=0;i<26;i++)

int cur=1;

for(int i=1;icur)else

if(maxp[str.charat(i)-'a']=i;

}return max;

}}

最長不含重複字元的子字串

題目 輸入乙個字串,找出字串中最長的不含重複字元的子字串,計算該子字串的長度。假設字串中的字元為 a z 例如 arabcacfr 最長的字串為 rabc 和 acfr 長度為 4 int find max len string str else dp str i a i return max le...

最長不含重複字元的子字串

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從 a 到 z 的字元。例如,在字串中 arabcacfr 最長非重複子字串為 acfr 長度為4。暴力,o n o n 分析 維持乙個記憶空間,記錄不重複時的最大長度,然後依次加入新字元,如果加入的字元重複了則...

最長不含重複字元的子字串

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 1 示例 2 示例 3 設定乙個大小為128的陣列記錄字元的下標,子字串的長度為j i 1。變數res記錄當前最長不含重複字元的子字串,變數j指向當前遍歷的字元,如果j指向的字元重複出現,變數i更新為j 1,這樣後面計算子字串長度的時候...