Longest Substring Without Repeating Characters 最长不重复子串【中】

Longest Substring Without Repeating Characters

给定一个字符串,寻找最长不重复子串长度。

难度:中等

比如:

"abcabcbb",结果是"abc" 长度为3

“bbbbb” 结果为b,长度为1

"pwwkew" 结果为wke,长度为3

此题很容易想到O(n^3)的解法即枚举所有子串O(n^2),然后判断每个子串是否有重复的字符O(n),所以总的时间复杂度为O(n^3)。当然如果这样解的话就丧失了这道题的意义了(不知道这种解法会不会超时)。下面介绍一个O(n^2)的解法。

对于任意一个子串ai,ai+1,ai+2,ai+3......aj 假设这个子串内部没有重复的字符,那麼当aj+1加入的时候只需要判断aj+1在之前找到的子串内部有没有相同的字符O(n),假设存在一个字符ak满足ak==aj+1,那麼刚刚找到的[ai,aj]子串就需要从位置k处断开来接受aj+1即变成[ai,ak],[ak+1,aj+1]此时计算子串长度合法的子串集合有[ai,ak],[ak+1,aj+1],[ai,aj],比较三种子串那个比较长即可结果保存在iResult里面,然后j往后继续组子串每次碰到有相同的字符的时候就根据上述的三个子串那个较长即可O(n),所以总复杂度为O(n^2)。代码如下:

class Solution {

public:
    int lengthOfLongestSubstring(string s) {
        int i, j, k = -1;//程序开始时,k位置不存在所以初始值为-1
        int iLen = s.length();
        int iResult = 1;

        for(j = 1; j < iLen; j ++)//扫描ai,ai+1,ai+2....aj,寻找位置k
        {
            for(i = j - 1; i > k; i --)
            {
                if(s[i] == s[j])
                {
                    k = i;
                    break;
                }
            }
            iResult = iResult > (j - i) ? iResult : (j - i);//取值
        }
            
        if(iLen == 0)
            iResult = 0;
        return iResult;
    }

};


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值