395 至少有K個重複字元的最長子串

2021-10-20 13:30:17 字數 1816 閱讀 6314

殘疾人**訓練

題目:給你乙個字串s和乙個整數k,請你找出s中的最長子串, 要求該子串中的每一字元出現次數都不少於k。返回這一子串的長度。

最開始的時候一頭霧水(因為我是殘疾人)

求子串的問題,在我看來,最難的地方就是時間複雜度

因為隨著字串長度的增加,全部字串的數量是呈指數級別上公升的,因此所有基於列舉所有字串的暴力演算法必定會超時

class

solution

};

整個演算法思想最大的錯誤在於這裡:

// pos == 0,說明整個字串沒有乙個字元出現次數大於等於k

// pos == s.length,說明完全滿足條件

if(pos == s.

length()

|| pos ==0)

return pos;

即使pos==0,整個字串也不一定完全不滿足條件

原諒我,我只是乙個殘疾人,這是我的第一次**訓練,難免會寫沙比**

經過修改和五六次本地debug後,得出的版本如下:

class

solution

};

執行時間0ms

首先對這個問題進行分析,給我乙個字串,我能得到的結果只有三種:

完全不符合條件

全部符合條件

一半符合一半不符合

完全符合和完全不符合很容易判斷:完全符合就返回當前的字串的長度,完全不符合就返回0

這裡的關鍵是一半符合一半不符合要怎麼進行處理,要怎麼樣才能把它分成完全符合和完全不符合的情況

對於第三種情況的字串,其內的字元必定存在一部分是滿足條件的,另一部分是不滿足條件的

對於任何乙個字串,只要存在不滿足條件的字元,那麼它一定不是完全滿足條件的

所以,我們要以不滿足條件的字元為分隔符,尋找最長的子串的長度

例如

"bbaaacbd" 3
這個測試樣例,其中c和d是不滿足條件的字元,我們將其用#代替,則是求這兩個子串

"bbaaa"

"b"

的最長字串的長度

其中,第二個子串明顯不符合

第乙個子串中的b變成了不滿足條件的字元,那麼我們將b作為分隔符,再次進行分割,只剩下aaa這個子串,而這個子串符合第二種情況,因此返回其長度,即3

實際操作的時候,受我懶惰的限制,將整個字串分成左右兩部分,分別求其最大長度

python之不用腦子法

class

solution

(object):

deflongestsubstring

(self, s, k):if

not s:

return

0for c in

set(s)

:if s.count(c)

< k:

return

max(self.longestsubstring(t, k)

for t in s.split(c)

)return

len(s)

果然python夠直接,適合我這類殘疾人使用

但是我還是不喜歡python,除非什麼時候它能跑得和c語言一樣快

c++之我是抄它的法

class

solution

};

395 至少有 K 個重複字元的最長子串

給你乙個字串 s 和乙個整數 k 請你找出 s 中的最長子串,要求該子串中的每一字元出現次數都不少於 k 返回這一子串的長度。示例 1 輸入 s aaabb k 3 輸出 3 解釋 最長子串為 aaa 其中 a 重複了 3 次。示例 2 輸入 s ababbc k 2 輸出 5 解釋 最長子串為 a...

395 至少有 K 個重複字元的最長子串 分治

給你乙個字串 s 和乙個整數 k 請你找出 s 中的最長子串,要求該子串中的每一字元出現次數都不少於 k 返回這一子串的長度。示例 1 輸入 s aaabb k 3 輸出 3 解釋 最長子串為 aaa 其中 a 重複了 3 次。class solution if n 0 n k vector has...

至少有 K 個重複字元的最長子串

原題指路 至少有 k 個重複字元的最長子串 給你乙個字串s和乙個整數k,請你找出s中的最長子串,要求該子串中的每一字元出現次數都不少於k。返回這一子串的長度。這道題有別於一般的 滑動視窗 的題目,因為這道題視窗的維護條件需要人為新增一項,即視窗中的字元種類數。雖然這看起來很複雜,但是由於這題的資料範...