LeetCode 3. Longest Substring Without Repeating Characters

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 subsequenceand not a substring.


题目大意:


给定一个字符串,最长连续没有重复字符的子串。

最直接的想法:

可以枚举每一种情况,

从第一个元素开始,往后遍历,如果有出现重复元素就停止,记录长度。

然后从第二个元素开始,往后遍历,如果有重复元素就停止,记录长度。

以此类推...我们从记录的最长的长度中选取最长的即是答案。 

但其实我们并不需要枚举每一种情况,假设我们从第i个元素开始,往后遍历,到第j个元素,是重复元素,那么,与j相同的元素在i个j之间,包括i,假设这个元素是i+p,那么i到i+p之间的元素是不需要遍历的,得到的长度总是比从i开始遍历短。我们只需要从i+p+1开始就可以保证不会丢失最优解。

需要注意的是:

在出现重复元素,进行下一次遍历的时候,要将即将遍历元素位置之前的标记都清除。

还有一种特殊情况,即整个字符串没有出现重复元素,按照之前的程序算法,这种情况是会丢失的,要做特殊处理。


题目代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int i=0, j=0, ans=0;
        int book[256] = {0};
       
        while(j < s.length()){
            
            if(book[s[j]] == 1){
                ans = max(ans, j-i);
                while(s[i] != s[j]){
                    book[s[i]] = 0;
                    i++;
                }
                i+=1;
            }else{
               book[s[j]] = 1;   
            }
            j++;
        }
        return max(ans, j-i);
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值