殘疾人**訓練
題目:給你乙個字串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。返回這一子串的長度。這道題有別於一般的 滑動視窗 的題目,因為這道題視窗的維護條件需要人為新增一項,即視窗中的字元種類數。雖然這看起來很複雜,但是由於這題的資料範...