題目:請從字串中找出乙個最長的不包含重複字元的子
字串,計算該最長子字串的長度。假設字串中只包
含『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,這樣後面計算子字串長度的時候...