给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
解法一:
思路:每次顺序读取s的一个元素s[i],用s1存读取的互异的字串;每读取一个元素s[i],用它逆序遍历s1,如果发现s1中某一元素s1[j]和s[i]相等,则从j+1直到s1尾部截取s1并把s[i]加到s1后面。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s == "") return 0;
string s1,s2;//s2用来重置s1
s1 = s1 + s[0];//s1用来存互异的字串
int len = 1;
for(int i = 1; i < s.length(); ++i){
bool flag = 1;//判断下面的for循环是否完整执行
for(int j = s1.length()-1; j >= 0; --j){
if(s[i] == s1[j]){
flag = 0;
if(s[i] == s[i-1]){//如果要判断的s[i]和它的上一位相等,则清空当前的s1
s1=s2+s[i];
len = max(len,int(s1.length()));//每次改变s1的时候更新len
break;
}
s1 = s1.substr(j+1) + s[i];
len = max(len,int(s1.length()));//每次改变s1的时候更新len
break;
}
}
if(flag) s1 = s1 + s[i];//for循环完整执行则在s1后加上s[i]
len = max(len,int(s1.length()));//每次改变s1的时候更新len
}
return len;
}
};
解法二:
利用hash表的思想,建立一个256的数组来存每个字符对应的值。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int a[256] = {0};
int l = 0,n = 0;//l表示无重复字串的长度,n表示无重复字串的左边界
for(int i = 0;i < s.size();++i){
if(a[s[i]] == 0 || a[s[i]] < n){
l = max(l,i-n+1);
}else{
n = a[s[i]];
}
a[s[i]] = i+1;
}
return l;
}
};