当确定了一个子串的窗口之后,遇到重复字符,要维护窗口时
我们可以确定左边界++
右边界是重新把窗口大小该为零(即此时右边界 = 左边界);
还是右边界不变,之后再继续维护呢?
- 以示例一中的字符串
a
b
c
a
b
c
b
b
abcabcbb
abcabcbb
为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:
- 以 ( a ) b c a b c b b (a)bcabcbb (a)bcabcbb 开始的最长字符串为 ( a b c ) a b c b b (abc)abcbb (abc)abcbb;
- 以 a ( b ) c a b c b b a(b)cabcbb a(b)cabcbb 开始的最长字符串为 a ( b c a ) b c b b a(bca)bcbb a(bca)bcbb;
- 以 a b ( c ) a b c b b ab(c)abcbb ab(c)abcbb开始的最长字符串为 a b ( c a b ) c b b ab(cab)cbb ab(cab)cbb;
- 以 a b c ( a ) b c b b abc(a)bcbb abc(a)bcbb 开始的最长字符串为 a b c ( a b c ) b b abc(abc)bb abc(abc)bb;
- 以 a b c a ( b ) c b b abca(b)cbb abca(b)cbb开始的最长字符串为 a b c a ( b c ) b b abca(bc)bb abca(bc)bb;
- 以 a b c a b ( c ) b b abcab(c)bb abcab(c)bb 开始的最长字符串为 a b c a b ( c b ) b abcab(cb)b abcab(cb)b;
- 以 a b c a b c ( b ) b abcabc(b)b abcabc(b)b 开始的最长字符串为 a b c a b c ( b ) b abcabc(b)b abcabc(b)b;
- 以
a
b
c
a
b
c
b
(
b
)
abcabcb(b)
abcabcb(b) 开始的最长字符串为
a
b
c
a
b
c
b
(
b
)
abcabcb(b)
abcabcb(b)。
C++ string::find() 函数复习传送门 代码理解后我们发现,右边界是上一个窗口不重复的右边界,左边界++,丝毫不影响右边界。
即右边界不变,之后再维护
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int l = 0, r = 1;
int n = s.length();
if(n == 0)
return 0;
if(n == 1)
return 1;
int ans = 1;
while(r < n)
{
if(s.find(s[r], l) < r)
{
l++;
}
else
{
ans = max(ans, r - l + 1);
r++;
}
}
return ans;
}
};
C++ string::find() 函数复习传送门
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)