无重复字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列  而不是子串。

 

老样子看到字母就想到分箱。。但是分箱需要重置零,而且匹配到重复字符时,必须回溯到前一个重复字符。。需要大量的操作浪费很多时间。

看了别人的解后发现只要加一个start指针就好了。。。。

思路就是碰到一个字符,先看一下hash表中它的上一个位置是否在start之后,是的话说明遇到重复字符了,计算出子串的长度,更新maxlen和start指针。或者碰到‘\0’也要计算len,最后更新一下hash表的数据,即该字符的位置。

int lengthOfLongestSubstring(char* s) {
    int a[128]={0};
    int ptr,pos=1,start=1;
    int len,maxlen=0;
    char *p=s;
    do{
        ptr=*p;
        if(a[ptr]>=start||ptr==0)
        {
            len=pos-start;
            if(len>maxlen)
                maxlen=len;
            start=a[ptr]+1;
        }
        a[ptr]=pos++;
    }while(*p++);
    return maxlen;
}

 

posted @ 2018-07-15 19:40  onlyandonly  阅读(143)  评论(0编辑  收藏  举报