比如:對於字串"abcba",那麼返回的結果應該是"abc"或者"cba"(返回乙個即可);對於字串"acbba",返回的應是"acb"
思路:利用haspmap,map的key儲存的是字元,value儲存的是字元當前的位置,利用containskey()方法檢測是否有重複
1、如果當前字元出現過並且index大於該字元上一次出現的index,那麼將map中該字元對應的value值替換,上一次出現的字元的下乙個字元到當前字元變為目前新的子串,(此時子串不一定是最大長度的子串,而是程式執行過程中當前不重複的子串)
2、如果目前新子串的長度(當前字元的index與startindex(目前新子串的初始index)的差值 + 1)大於maxlen(最長不重複子串長度),更新maxlen,如果要輸出這個不重複子串,需要記錄startindex
3、記錄當前字元的index
以"abcba"為例:
1、map.put('a',0),初始startindex為0,maxlen為1,map.put('b',1),startindex為0,maxlen為2,map.put('c',2),startindex為0,maxlen為3,此時子串為"abc",map.put('b',3),檢測到有重複,則目前新的子串變為『cb』,將map中字元'b'的index替換為3,maxlen為2,startindex變為2
2、目前新的子串為'cb',index為3,startindex為2,長度為2,小於最大長度,不更新maxlen
掃瞄完以後,根據oristartindex(maxlen改變時記錄的startindex)和maxlen來得到最長不重複子串
具體**如下:
import j**a.util.hashmap;
public class findlongestsubstring
} if(index - startindex + 1 > maxlen)
charsindex.put(strchararr[index], index);
} for(int index = oristartindex; index < oristartindex + maxlen; index++)
system.out.println(maxsubstring.tostring());
}
最長不重複子串
出處 勇幸 thinking 題 從乙個字串中找到乙個連續子串,該子串中任何兩個字元不能相同,求子串的最大長度並輸出一條最長不重複子串。本節從最直接的方法逐步優化,漸進探索了四種實現方式,並最終找到時間複雜度為o n 輔助空間為常數的方案,內容如下 基本演算法 使用hash dp方案 dp hash...
最長不重複子串
演算法參考 找到乙個字串中的乙個連續子串,這個子串內不能有任何兩個字元是相同的,並且這個子串是符合要求的最長的。例如輸入 abcbef 輸出 cbef o n 的演算法,具體思路如下 以abcbef這個串為例,用乙個陣列pos記錄每個元素曾出現的下標,初始化為 1。從s 0 開始,依次考察每個字元,...
最長不重複子串
題目鏈結 給定乙個字串,找到最長的子串,要求該子串中沒有重複的字元。例如 字串abcabcbb的不含重複字元的 最長 子串為abc,長度為 3。而bbbbbb的不含重複字元的 最長 子串為b,長度為 1。輸入格式 輸入包含多行,每一行對應乙個長度不超過 100 的輸出,直到遇到結束符為止。每行依次輸...