2020-6-5
- 科技是槍,也是玫瑰。
有時人們持槍遠征,荒廢了玫瑰園;
有時人們沉迷園藝,家園卻被鐵蹄踏平。
而在那些偉大的故事裏,人們手握鋼槍,身後鮮花盛開。
題目:
- leetcode – 3. 無重複字符的最長子串
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
個人解答:(C版本)
-
使用的是時間複雜度比較高的暴力實現,就是不斷的比較,定義 r 用來存放子串右邊位置,這個值不斷右移,移動一次就與前面l位置開始到r-1的位置的值比較。詳情看代碼。
int lengthOfLongestSubstring(char * s){ int max_size = 0; int cur_size = 0; if(s == NULL) return 0; if(s[0] == '\0') return 0; int l = 0; // 用來存放子串最左邊的位置 int r = 1; // 用來存放子串右邊位置,這個值不斷右移,移動一次就與前面l位置開始到r-1的位置的值比較。 while(s[r] != '\0') { for(int i=l; i<r; ++i) { if(s[r] == s[i]) // 找到相同的值 { cur_size = r - l; l = i+1; // 更新l的位置 if(max_size < cur_size) max_size = cur_size; } } ++r; } cur_size = r-l; if(max_size < cur_size) max_size = cur_size; return max_size; }
-
複雜度分析
1)時間複雜度:兩層循環,O(N^2)。
2)空間複雜度:O(1),只使用常數量級的變量。
- 運行結果: