刷題-力扣-3
阿新 • • 發佈:2020-12-02
3. 無重複字元的最長子串
題目連結
來源力扣(LeetCode)
連結:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題目描述
給定一個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例1:
輸入: s = "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: s = "bbbbb" 輸出: 1 解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: s = "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是"wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke"是一個子序列,不是子串。
示例 4:
輸入: s = ""
輸出: 0
提示:
0 <= s.length <= 5 * 104
s由英文字母、數字、符號和空格組成
題目分析
- 定義front指向字串的起始位置,rear指向rear的結束位置,front-rear+1記為字串長度。
- 當front每指向下一位的時候,判斷front當前的字元是否和rear到front前一位中的字元重複。
- front和rear到front前一位中的字元重複,則rear指向重複的字元位置的下一位。
- 再次front++,再次執行步驟1到步驟3。
- 最長字串的長度就是步驟1到步驟4中front-rear+1最大的情況。
程式碼
class Solution { public: int lengthOfLongestSubstring(string s) { int front = 1; int rear = 0; int max = 0; if(s.length() == 1) return 1; while(front < s.length()) { for(int i = rear; i < front; i++) { if(s[i] == s[front]) { rear = i + 1; break; } } int fake = front - rear + 1; if(fake > max) max = fake; front++; } return max; } };
用時23min