题目:
Given a string, find the length of the longest substring without repeating characters. For example,
the longest substring without repeating letters for “abcabcbb” is “abc”, which the length is 3.
For “bbbbb” the longest substring is “b”, with the length of 1.
Subscribe to see which companies asked this question
解法:
将最长子串的起始点设为i,结尾点设为j,那最长子串的长度就是j-i,每次循环比较可得出最大值。但是获取一次子串后,i需要移到出现重复的字符的后面一位。比如:”abcabc”,j到第二个a时终止,此时长度为3,下一次的计算则要将i设在第一个a后面(也就是第一个b这个位置)。j的位置只需继续往后移动即可。总的算法复杂的为O(n)+O(n)->O(n)。
class Solution
{
public:
//O(n) + O(n) -> O(n)
int lengthOfLongestSubstring(string s)
{
int i,j,max_length;//i表示最长子串的初始位置,j表示末尾位置,max_length表示最大长度
i = 0;
j=0;
max_length = 0;
int n = s.length();//字符串总的长度
bool exist[256] = {false};//256对应了ASCII表上256个字符
while(j<n)
{
if(exist[s[j]])//如果s[j]的位置的字符在前面已经存在过了
{
max_length = max(max_length,j-i); //将当前子串的长度与最大比较,获取最大的长度
//比较完了,要进行下一轮的子串获取了,在这之前要将之前的子串置为不存在,同时移动子串起始点i,不然一直为0
//将i移到s[j]这个字符前面与之相同的字符那个位置
while(s[i]!=s[j])
{
exist[s[i]] = false;
i++;
}
i++;
j++;
}
else
{
exist[s[j]] = true;
j++;
}
}
max_length = max(max_length,n-i);//如果最后一个子串,没有遇到与之一样的字符,则用n-i,表示最大长。
return max_length;
}
};