1. 程式人生 > >無重復字符的最長子串

無重復字符的最長子串

pan 操作 sta 必須 hash表 浪費 字符串 art int

給定一個字符串,找出不含有重復字符的最長子串的長度。

示例:

給定 "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; }

無重復字符的最長子串