剑指offer48:最长不含重复的字符字串
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
解题思路:
利用双指针加哈希map来求解。
哈希map来记录字符及其下标unordered_map<char,int> m //字符,下标。
遍历的时候判断当前字符是否是在m中存在,如果存在就让left指向重复字符的下一个字符。如果不存在right指向下一个。判断当前窗口的长度的长度是否最大,最大保存,不是进行下一次遍历。
代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty())return 0;
if(s.size()==1)return 1;
unordered_map<char,int> m;
int left = 0,right = 0,ret = 0;
while(right<s.size()){
//判断当前的字符是否在窗口中出现,如果出现,left = 出现字符位置的下一个
if(m.find(s[right])!=m.end())left = max(left,m[s[right]]+1);
m[s[right]] = right;
right++;
ret = max(right-left,ret);
}
return ret;
}
};