字串中最長無重複字元的子串

2021-07-08 22:08:07 字數 2114 閱讀 9296

題目:求乙個字串中最長的沒有重複字元的子串。

方法一:窮舉法,使用2重外迴圈遍歷所有的區間,用2重內迴圈檢驗子串是否符合「無重複字元」這一要求。其中外層迴圈i、j 遍歷所有的下標,m、n是內層迴圈,檢查區間[i,j]是否符合要求。空間複雜度是o(1),時間複雜度o(n^4)。

//

o(n^4)的時間複雜度

int max_unique_substring1(char *str)

}if(flag == 1) break

; }

if(flag==0 && j-i+1>maxlen)

}printf(

"%.*s\n

", maxlen, &str[begin]);

return

maxlen;

}

方法二:對方法一的檢驗子串是否「無重複字元」進行改進,使用hash表記錄字元是否出現過。

//

o(n^2)的時間複雜度

int max_unique_substring2(char *str)

if(j-i >maxlen)

}printf(

"%.*s\n

", maxlen, &str[begin]);

return

maxlen;

}

方法三:對字串「axbdebpqawuva」構造下表:

表中,字串有3個『a』,有2個『b』,其餘為單一字元。next記錄了下乙個與之重複的字元的位置,如str[0]=str[8]=str[12]=『a』,這時next[0]=8,next[8]=12,next[12]=13,其餘同理。值得注意的是,對於沒有重複字元的,next儲存字元結束符『\0』的下標,即13。

這裡,first[i]表示i之後,第一次出現重複字元的那個位置。例如,str[0]之後,第一次出現的重複字元是str[5]=『b』,當然,從str[1],str[2]開始也是一樣。而從str[3]開始,要到str[12]才出現重複字元『a』。可以證明,從str[i]起的最長符合要求的長度為first[i]-i,區間為[i,first[i]-1]由此得解。上述最長串是當i=3時,first[i]-i=12-3=9。結果最長無重複子串為「debpqawuv」。

//

o(n)的時間複雜度

int max_unique_substring3(char *str)

for(int i=0; i)

}free(first);

free(next);

printf(

"%.*s\n

", maxlen, &str[begin]);

return

maxlen;

}

另一種實現:visit記錄每次字元出現的位置,當出現重複字元時,通過兩次重複字元的位置得到新的子串的長度,但是,每次只通過重複字元的位置得到新的子串的長度是不對的,還需要考慮上一次子串的開始位置。

//

o(n)的時間複雜度

int max_unique_substring3(char *str)

else

else

}if(curlen >maxlen)

}printf(

"%.*s\n

", maxlen, &str[begin]);

return

maxlen;

}

方法四:使用字尾陣列

對這個字串構造字尾陣列,在每個字尾陣列中,尋找沒有重複字元的最長字首,最長的字首就是要找的子串。

//

得到字串最長的無重複的字首長度

int longestlen(char *p)

return

len;}//

使用字尾陣列解法

int max_unique_substring4(char *str)

for (int i=0; i)

}printf(

"%.*s\n

", maxlen, a[begin]);

return

maxlen;

}

求字串中最長無重複字元的子串

題目 求乙個字串中最長的沒有重複字元的子串。方法一 窮舉法,使用2重外迴圈遍歷所有的區間,用2重內迴圈檢驗子串是否符合 無重複字元 這一要求。其中外層迴圈i j 遍歷所有的下標,m n是內層迴圈,檢查區間 i,j 是否符合要求。空間複雜度是o 1 時間複雜度o n 4 o n 4 的時間複雜度 in...

求字串中最長無重複字元的子串

題目 求乙個字串中最長的沒有重複字元的子串。例如字串 abcdaefgh 使用hash表記錄是否之前的字元出現,具體 如下 o n 2 的時間複雜度 int max unique substring2 char str if j i maxlen break之後,比較當前的最大不重複子串的長度與之前...

求字串中最長無重複字元的子串

題目 求乙個字串中最長的沒有重複字元的子串。方法一 窮舉法,使用2重外迴圈遍歷所有的區間,用2重內迴圈檢驗子串是否符合 無重複字元 這一要求。其中外層迴圈i j 遍歷所有的下標,m n是內層迴圈,檢查區間 i,j 是否符合要求。空間複雜度是o 1 時間複雜度o n 4 o n 4 的時間複雜度 in...