题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"
,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
解题思路
用一个map记录当前子字符串的所有字符,字符串依次向右扩展,若当前子字符串已有该字符,则从当前子字符串的第一个字符开始遍历,对于不同于该字符的字符在map中删除,直到遇到当前字符则停止,下一次扩展就从此字符的下一个位置开始;若当前子字符串没有该字符,就在map中记录该字符。
代码
1 class Solution { 2 public: 3 int lengthOfLongestSubstring(string s) { 4 if(s.empty()) return 0; 5 map<char, int> m; 6 int max_len = 1, left = 0, right = 0; 7 while(right < s.length()){ 8 if(m.count(s[right]) == 0) 9 m[s[right]] = 1; 10 else{ 11 while(left < right && s[left] != s[right]){ 12 map<char, int>::iterator it; 13 it = m.find(s[left]); 14 m.erase(it); 15 left++; 16 } 17 left++; 18 } 19 max_len = max(max_len, right - left + 1); 20 right++; 21 } 22 return max_len; 23 } 24 };