剑指offer-最长无重复子串的长度

剑指offer-最长无重复子串的长度

题目描述:从字符串中找出一个最长的不包含重复字符的子字符串,计算其长度。如arabcacfr中,最长无重复的子串是acfr,长度为4。

题目解析:

这道题可以利用动态规划的手段去解决。

设 f(i) 就是以i字符结尾的最长无重复子串。

那么就有两种情况:1. i之前没有出现过。很容易理解 f(i) = f(i-1) + 1,如上面例子中第一个r,f(i-1)=1(“a”),r是第一次出现,并不会出现重复的情况

                              2. i之前出现过: 

                                  这里又需要分两种情况去考虑:1. d(i与i上一次出现的距离) > f(i-1)  f(i)=f(i-1)+1。 例如这种情况  a r a b c a c fr,对于r来说并不影响以它结尾的最长子串。

                                                                                 2. d(i与i上一次出现的距离) <=f(i-1) f(i) = d。 例如这种情况  a r a b c a c f r,说明a出现的位置在上一次f(i-1)中,这时以a结尾的最长无重复子串长度就是d。


                             需要注意的是应当设定一个全局变量max,去记录当前最大值,d与max需要进行比较,得到最大的值。                      

代码(C++实现)

class DistinctSubstring {
public:
    int longestSubstring(string A, int n) {
       int ret=0;
       int curLength=0;
       int* position = new int[26];
        for(int i = 0;i<26;i++)
            position[i] = -1;
        
       for(int i = 0;i< A.size();i++)
       {
           int prevIndex = position[A[i]-'a'];
           if(i-prevIndex>curLength || prevIndex==-1 )
           {
               curLength++;
           }
           else{
              // if(curLength>ret)
                //   ret = curLength;
               curLength = i - prevIndex;
           }
           position[A[i]-'a']=i;
           if(curLength>ret)
               ret = curLength;
       }
        return ret;
         
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值