leetcod【第二周】:检测输入字符串中的最长非重复子字符串长度

题名: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;
    }
};
   
   
运行时间:22ms


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值