找出字串的最長不重複字串

2022-09-15 08:54:13 字數 1310 閱讀 8622

這是我遇到的一道校招題目:

給定一字串只包含數字,請寫乙個演算法,找出該字串中的最長不重複子串(不重複是指子串中每一元素不同於子串中其他元素)

如: 「120135435」最長不重複子串為 "201354"

要求用j**a或者c來寫,我用了j**a。

/*** 思想:

*      從頭開始擷取字串,只要後乙個元素不在擷取的字串裡,就更新擷取,多擷取乙個元素。

*       如果發現後乙個元素出現在字串裡, 將最後擷取的字串存為臨時結果,開始位置後移一位,結束位置為開始位置下一位....

**      從靠前那個發生重複的字元後一位 開始 向 剛剛擷取到的結束為止後乙個字元 乙個乙個向後擷取字串....

*      如果新一輪擷取的字串比臨時結果長,就更新臨時結果

*      從頭到尾所有部分都嘗試擷取之後,返回最長的那個臨時結果

** 偽**:

* 用start 和end 標記我擷取的字串的開始和結束的位置。 剛開始 start = 0   end = 1

* 迴圈:start從0到 待擷取字串的倒數第二個元素

*      0 結果字串res ,初始為空字串「」

*      1 從start 到end之前乙個元素 把 str 擷取乙個臨時字串 temp

*      2 迴圈:

*          判斷end所在字元是否在temp裡面出現過

*              否: end++   更新temp賦值成新的  從start 到end前乙個元素的字串

*              是: 跳出迴圈

*      3 在2迴圈中 temp 不斷被更新, 跳出2迴圈後,如果temp比res長,就更新res為temp,否則什麼都不做

*      4 start後移一位 , end改為start的下一位**/

我的**:

1

class

solution

16//

跳出迴圈說明下乙個元素與當前擷取字串重複了

1718

//如果當前擷取比臨時結果長 就更新臨時結果 再重新開啟一輪查詢位置

19if(temp.length() >res.length())

2223

//將新的起始位置自增1 end調整到start的下一位

24 start++;

25 end = start +1;

2627}28

29return

res;30}

3132 }

最長不重複字串

一直以為這個方法是對的,後來發現這種方法是錯誤的,不能處理巢狀的情況,如 adercijckega 稍後再修正!最近面試遇到這題,再網上參考了一些blog,自己歸納出方法並用c 實現。問題 求出字串中最長不重複的字串,如 abccdefgchi 最長不重複字串為defgchi.分析 1.定義乙個二維...

最長不重複字串

程式設計 給定兩個字串a,b 只包含26個英文本母 輸出所有公共的最長子字串 如果出現重複子串,則輸出多次 輸入包括兩行,每行為乙個連續字串 大小寫敏感 輸出包括多行,每行為掃瞄到的最長公共子串,按照該子串在字串a 即第一行輸入字串 中出現的先後次序輸出 abcxyzabcrst opqrstabc...

找出字串

有乙個排過序的字串陣列,但是其中有插入了一些空字串,請設計乙個演算法,找出給定字串的位置。演算法的查詢部分的複雜度應該為log級別。給定乙個string陣列str,同時給定陣列大小n和需要查詢的string x,請返回該串的位置 位置從零開始 測試樣例 a b c d 6,c 返回 3 思路 二分查...