至少有K個重複字符的最長子串(LeetCode395)---C++實現

思路:

最差的方法是雙重循環,時間複雜度O(n^2),所有一定可以優化爲O(nlgn)。聯想到快排、歸併排序,都是分治的思路,這裏也是利用分治,關鍵是找到分治的區分點。
遍歷字符串,找到出現次數少於k次的字符,位置記爲i,分爲(0,i-1) 和(i+1, s.size() - 1)
兩個區間,再遞歸,最後取兩區間的最大值。

int longestSubstring(string s, int k) {
	if (!s.size())
		return 0;
	int *hashMap = new int[26];
	for (int i = 0; i < 26; i++)
		hashMap[i] = 0;
	for (int i = 0; i < s.size(); i++)
		hashMap[s[i] - 'a']++;
	int sum = 0;
	//記錄是否有小於k次的字符
	bool flag = false;
	for (int i = 0; i < s.size(); i++) {
		if (hashMap[s[i] - 'a'] < k) {
			flag = true;
			sum = max(longestSubstring(s.substr(0, i), k), longestSubstring(s.substr(i + 1, s.size()), k));
			//這裏直接break 如果不break 不影響結果 但影響效率 會重複計算相同的情況
			break;
		}
	}
	if (!flag)
		return s.size();
	return sum;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章