記住一點,所有求字串的子串的題都可以借助滑動視窗思想來解決,因為它可以以o(n)的時間複雜度來解決問題,比暴力法要快很多
滑動視窗模板
其中 valid 變數表示視窗中滿足 need 條件的字元(對兩個字串進行比較歸根到底還是去比較這兩個字串的字元)個數,如果 valid 和 need.size 的大小相同,則說明視窗已滿足條件,已經完全覆蓋了串 t。
現在開始套模板,只需要思考以下四個問題:
1、當移動 right 擴大視窗,即字元滿足條件加入字元時,應該更新哪些資料?
2、什麼條件下,視窗應該暫停擴大,開始移動 left 縮小視窗?
3、當移動 left 縮小視窗,即移出字元時,應該更新哪些資料?
4、我們要的結果應該在擴大視窗時還是縮小視窗時進行更新?
如果乙個字元進入視窗,應該增加 window 計數器;如果乙個字元將移出視窗的時候,應該減少 window 計數器;當 valid 滿足 need 時應該收縮視窗;應該在收縮視窗的時候更新最終結果。
void slidingwindow(string s, string p)
}}
t438字母異位詞的實現:
滑動視窗思想,在s中找p的字母異位詞的子串,即為在s中找到由p中所有字母所形成的排列組合(也就是在s中找到這麼乙個字串,其內各字元以及出現的次數均與p中各字元以及出現的次數完全相同)。
class solution
//c表示即將移除視窗window的字元
char c = s.charat(left);
//為下一次移除做準備,也就是重新指向移除後的視窗的起始位置
left++;
//移出元素(左移)時需要進行的更新操作:
//若c表示的字元是乙個我們想要的字元,將其移出一次後,該字元再window與在need這兩個視窗**現的次數必然不同了,那麼它就不再是乙個有效字元了
if(need.containskey(c))
//將c所表示的字元在window**現的次數-1
window.put(c,window.getordefault(c,0)-1);}}
}return res;
}}
暴力法直接超時:每次從s中擷取長度=p的長度的字串q,然後檢查q是否為p的字母異位詞
重點在於如何檢查q是否為p的字母異位詞。
class solution
}return res;
}}
49 字母異位詞分組
給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 說明 所有輸入均為小寫字母。不考慮答案輸出的順序。思路 這個題的思路非常清晰,遍歷字串陣列,對其中每乙個...
49 字母異位詞分組
arrays.sort排序的時間複雜度為o slogs 外面還有n次迴圈,總共為nslogs,s為字串的長度。空間複雜度為o ns hashmap儲存了每個字串 1 我對arraylist操作不熟,還有arrays.sort 得趕緊學習了 2 乙個字串會有原始字元,所以只要知道原始字元,原始字元下一...
49 字母異位詞分組
給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 1.對每個子串排序生成乙個新的陣列,構造乙個字典d,遍歷新陣列往字典裡放 o nklogk o nk 2...