您的位置:首页 > 其它

LeetCode (3)Longest Substring Without Repeating Characters

2017-04-12 16:30 423 查看

(3)Longest Substring Without Repeating Characters

题目:给定一个字符串的长度,发现最长的子连续串并且没有重复字符

例如:“abcabcbb”,答案是“abc”,长度是3

再例:“bbbbb”,答案是“b”,长度是1

这道题是最长非重复连续子序列问题,第一个想法就是做成一个带下标的数组,然后通过数组的标记,获取序列长度。

建立两个数组,一个是字符的重复位置,此处定义为next,就是说当你发现一个字符在后面有出现的时候,就在这个位置标注下次出现的位置,比如“abcaca”,那么对于“a”有next[0]=3,next[3]=5,对于“c”有next[2]=4,每个位置都标记完成后,再建立一个数组,此处定义为first,统计第一次出现重复字符的位置,从后向前遍历,当下次出现重复字符的位置小于上一次出现的位置,也就是说next[i]是小于first[i+1]的,那么就将本位置的first值也就是first[i]赋值为next[i],不然将本位置也就是first[i]赋值为first[i+1],当所有的first赋值结束后,first数组内所有的数字是从此位置到出现重复时的位置,长度自然是 len = i - first[i],这样就可以直接获取最长非重复连续子序列长度maxlen了。

下面是参考代码:

class Solution {
public:
int lengthOfLongestSubstring(string s) {
int next[100000],first[100000];
int len = s.length();
int i = 0, j = 0;
int maxlen = 0;
for(; i < len; i ++){
string str = s.substr(i,1);
int index = s.find(str, i + 1);
next[i] = index==-1?len:index;
}
first[len] = len;
for(j = len - 1; j >= 0; j --){
if(first[j+1] > next[j]){
first[j] = next[j];
maxlen =  maxlen > (first[j] - j)?maxlen:(first[j] - j);
}
else{
first[j] = first[j+1];
maxlen =  maxlen > (first[j] - j)?maxlen:(first[j] - j);
}
}
return maxlen;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: