题名:Longest Substring Without Repeating Characters
问题描述:
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
问题分析:
这是一个计算字符串中最长非重复子字符串的问题,既然要考虑是否重复,那么一定存在字符串字符间的比较问题。所以,一开始先排除不需要进行字符比较的情况,即当字符串长度为0或1的时候,很明显最长非重复子字符串就是其本身,所以直接返回字符串长度即可。然后考虑需要进行比较的情况。如下图所示:
我们从第二个字符开始逐个遍历,每一轮当前字符与前面的无重复子字符串中的字符逐个比较,若不重复,那么当前的无重复子字符串就是前面的无重复子字符串加上当前的字符,并记录更新当前的最大无重复子字符串的长度记录。若重复,则与当前字符重复的字符,我们假设它是K,将会把之前的无重复子字符串分割成两部分,当接下来我们继续读取下一个字符,并将它拼接成无重复子字符串的时候,在K前面的无重复子字符串的长度已经不可能再增长(也就是不可能再比上一轮记录的无重复子字符串的长度大),而K后面的字符串的长度还有增长的空间(即有可能找到我们上一轮记录的最大无重复子字符串的长度更长的无重复子字符串),所以下一轮用作与当前字符比较的无重复子字符串应当从K的前一位开始,所以我们就可以得到如下的实现方法。
代码实现:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.length();
if(len==0||len==1)
{
return len;
}
int pre = 0; /**非重复子字符串的开始下标**/
int answer = 0; /**最大非重复子字符串的长度**/
bool flag = 0;
int j = 0;
/** i =1 ,即从第二个字符开始与前面字符串比较**/
for(int i=1;i
answer)
{
answer = i-pre+1;
}
}
return answer;
}
};