您的位置:首页 > 其它

Longest Substring Without Repeating Characters (leetcode中等题 尺取法)

2018-01-05 00:49 471 查看
题目大意:找出一个字符串的子串,使得子串中没有相同字符,求能找到子串的最长长度。如abcbc最长就只有abc长度为三。

解法:典型的双指针题目,声明两个指针i,j。先i从0开始往后扫,如果发现重复字符,计算此时的长度,然后固定i,往后移动指针j,使得不存在不存在重复字符为止。

举例如下:对于字符串abacded,一开始i=0;j=0;

然后开始扫描I,i=1,长度为2,没有重复字符。记录当前长度,并且用ch['b']++做标记表示b字符已经被经历过了。

继续向后扫描,i=2,发现有重复字符,即ch['a']!=0,固定i=2,然后扫描j,j向后移动一位,ch['a']--,然后发现ch['a']==0,那么表示J移动到这里就解决了i,j之间字符重复的问题,此时计算中间长度,为i-j+1=2。

既然i,j之间没有了相同字符,那么可以继续扫描i,到c,d,e都没有问题。此时长度为i-j+1 = 5-1+1 = 5;ch['c++'].ch['d']++,ch['e']++;

然后j往后移动到最后一个d发现ch['d']>0了,那就表示在i,j之间已经有一个d字符了,那么又开始往后扫描j,知道ch['d']==0为止,很容易知道,j需要走到4位置后面一个位置才能保证i,j之间没有重复。

代码如下:

class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.length();
if(len==0)return 0;
int ch[300];
memset(ch,0,sizeof(ch));
int i=1,j=0;int num = 1,sum=1;
ch[s[0]]++;
while(i<len){
char c = s[i];
if(ch[c]!=0){
while(s[j]!=c){
ch[s[j]]--;
j++;
}
j++;
num = max(num,i-j+1);
sum = i-j+1;
}
else {
sum++;ch[c]++;
num = max(num,sum);
}
i++;
}
return num;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode