无重复字符的最长子串
2019-08-17 本文已影响0人
漆黑烈焰武士G
无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
模板:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//ASCII表共能表示256个字符
int vec[256];//明明只是个数组不知道为啥起名叫vec
//[-1,-1,-1,-1,-1,-1,……,-1,-1,-1]
for(int i=0;i<256;i++)
vec[i]=-1;
int in=-1,maxx=0;
for(int i=0;i<s.length();i++)//遍历字符串
{
//step2(再看这里)
//当(vec[s[i]] > -1)的时候,说明vec已经经历了下面的赋值
//之后的vec[s[i]]只要被赋值,就一定比in大
//所以in值就是每次重复的时刻,也就是每次不重复字符串的起点
//in只要被赋值就说明该字母已经重复过(最少这就是第一次)
if(vec[s[i]] > in)
{
in= vec[s[i]];
}
vec[s[i]]=i;
/*step1(先看这里)
"pwwpew"所要经历的:
vec[p] = 0;vec[w] = 1;vec[w] = 2;vec[p] = 3;vec[e] = 4;vec[w] = 6;
遍历结束后:
vec[p] = 3;vec[e] = 4;vec[w] = 6;
*/
//step3(最后看这里)
//i-in 就是每次循环与不重复字符串起点的差值
//找到最大的差值并赋值即可
if(maxx<i-in)
maxx=i-in;
}
return maxx;
}
};