劍指offer 48 最長不含重複字元的子字串

2021-09-19 13:15:56 字數 974 閱讀 9621

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。

定義函式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...