(难度:中等)给定一个字符串 s
,请你找出其中不含有重复字符的 最长
子串
的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
思路:本题的重点在于观察到:在任意字符串中遍历寻找不重复字符串时,不重复字符串中随着起始字符的位置后移,最后一个字符串的位置也会后移,所以不需要重复判断字符串的中间部门:
以字符串abcabcbb 为例
以 (a)bcabcbb开始的最长字符串为 (abc)abcbb;
以 a(b)cabcbb开始的最长字符串为 a(bca)bcbb;
以 ab(c)abcbb 开始的最长字符串为 ab(cab)cbb;
以 abc(a)bcbb 开始的最长字符串为 abc(abc)bb;
以 abca(b)cbb开始的最长字符串为 abca(bc)bb;
以 abcab(c)bb开始的最长字符串为 abcab(cb)b;
以 abcabc(b)b 开始的最长字符串为 abcabc(b)b;
以 abcabcb(b)开始的最长字符串为 abcabcb(b)。
class Solution {
public:int lengthOfLongestSubstring(string s) {int max=0;int lon=0;map<char,int>exit;int j=0;//指向不重复字符串尾部if(s=="") return s.size();// else if(s==" ") return s.size();else {//cout<<"进入判断"<<endl; for(int i=0;i<s.size();i++){//注意字符串中最后一个是'\n'// cout<<s[i]<<":";char value=s[i];exit[value]=1;//表示当前value在判断的字符串中if(i==0)lon=1;else if(lon>1) {lon=lon-1; exit[s[i-1]]=-1;}// cout<<" lon:"<<lon<<endl;if(i<s.size() && j+1<s.size() && i==j)j++;while(exit.find(s[j]) == exit.end() || exit[s[j]]== -1){//j对应的元素没有在字符串中出现过// cout<<s[j]<<"->";lon++;exit[s[j]]=1;if(j<s.size()-1) //注意判断,否则会溢出j++;elsebreak;}cout<<endl;if(lon>max)max=lon;}return max;}}
};