這是我遇到的一道校招題目:
給定一字串只包含數字,請寫乙個演算法,找出該字串中的最長不重複子串(不重複是指子串中每一元素不同於子串中其他元素)
如: 「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的下一位**/
我的**:
1class
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 思路 二分查...