Longest Substring Without Repeating Characters

题意:给你一个字符串,求一个连续的没有重复字符的最大子串。

思路:设置两个数组flag[256]和pos[256],flag记录某个字符是否包含在当前子串中,pos记录某个字符在当前子串中的位置。当出现重复字符ch时,就把当前字符串中ch前面               的字符全部去掉,并更改flag和pos。

算法流程:b a c a b c b b

                              ↑  (i=3,len=3,flag['b','a','c']=true,pos['b','a','c']=[0,1,2],当前子串bac)          

                    此时字符a重复出现,子串bac→c,并加入a,所以当前子串变为为ca,len=2,flag['c','a']=true,pos['c','a']=[2,3]

                    ……


class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int maxlen=0,len=0;
        bool flag[256];//标记每个字母是否出现
        int pos[256];//记录位置
        for(int i=0;i<256;i++)
            flag[i]=false;
        for(int i=0;s[i];i++)
        {
            if(!flag[s[i]])
            {
                flag[s[i]]=true;
                len++;
            }
            else
            {
                for(int j=i-len;j<pos[s[i]];j++)
                    flag[s[j]]=false;
                len-=(pos[s[i]]-(i-len));
            }
            if(len>maxlen)
                maxlen=len;
            pos[s[i]]=i;
        }
        return maxlen;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值