請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。
定義函式f(i)表示以第i個字元為結尾的不包含重複字元的子字串的最大長度。下面以第i個字元之前有沒有出現過重複字元分為兩種情況討論。
如果第i個字元之前沒有出現過重複字元,即f=f(i-1)+1。在字串「dhabcacfh」
中,顯然f(0)=1,計算下標為1的h之前沒有出現過h,所以f(1)=f(0)+1=2。最長的不包含重複字元的子字串為「dh」。
如果第i個字元之前出現過重複字元,就要計算第i個字元和它上次出現在字串中得位置的距離d。分兩種情況:
(1)如果d小於或等於f(i-1),此時第i個字元上次出現在f(i-1)對應的最長子字串中,因此f(i)=d;
(2)如果d大於f(i-1),此時第i個字元上次出現在f(i-1)對應的最長子字串之前,f=f(i-1)+1成立依然。以字串「dhabcacfh」為例,在最後乙個字元h之前以f為結尾的最長不包含重複字元的字串是"acf",即f(7)=3。最後乙個字元h在字串「arabcacfr」中下標為1的位置出現過,即d=7>f(7),說明上乙個字元h不在f(7)對應的最長子字串"acf"中,因此f(8)=f(7)+1=4。即以h為結尾的最長不包含重複字元的字串是"acfh"。
**如下:
#include#includeint longeststrnorepetition(char *str, int length)
for (int i = 0; i < length; i++)
//標記i出現在str字串中的下標
position[str[i] - 'a'] = i;
} if (curlength>maxlength)
maxlength = curlength;
free(position);
position = null;
return curlength;
}
劍指offer48 最長不含重複字元的子字串
輸入乙個字串 只包含 a z 的字元 求其最長不含重複字元的子字串的長度。例如對於 arabcacfr,最長不含重複字元的子字串為 acfr,長度為 4。方法1 暴力法 判斷乙個字串是否重複 def repeatstring str for i in range len str 1 for j in...
劍指offer 48 最長不含重複字元的子字串
題目出處 leetcode 劍指offer 48 最長不含重複字元的子字串 這道題和leetcode 3 無重複字元的最長子串相同。請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。曾經面試農業銀行,二面出了這道題。如果採用暴力的方法,首先乙個長度為n的字串,它的子串有n n ...
劍指offer(48) 最長不重複字元子串
題目描述 請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。思路分析 滑動視窗雙指標 1.初始化頭尾指標 head,tail 2.tail 指標右移,判斷 tail 指向的元素是否在 head tail 的視窗內 3.返回視窗長度的最大值。def lengthoflongest...