题目要求:给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
分析:要求无重复字符的最长字串,可以分析出我们要解决两个问题,①遍历所有字串②判断字符重复
①定义个双指针i,j,s[i...j]代表当前无重复字符字串,如果j+1的所在字符跟是s[i..j]里的不重复,那就j++把此字符添加进来,如果字符重复,肯定是跟i所在字符重复,i--把i所在位置字符去除。
②定义长度为256的数组,包含256的字符对应的码值,默认长度为0。如果为0,说明还不重复,出现一次长度加一,记录有无重复。
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int count[256]={0};//判定字串中有无重复字符
int l=0,r=-1;//nums[l...r]为滑动窗口,扫描整个字符串
int res=0;
while(l<s.size())
{
if(r+1<s.size()&&count[s[r+1]]==0)
count[s[++r]]++;
else
count[s[l++]]--;
res=max(res,r-l+1);
}
return res;
}
};