問題描述:給定一個字元串,找出這個字元串中最長的不重覆串。 比如:對於字元串"abba",那麼返回的結果應該是"ab"或者"ba"(返回一個即可);對於字元串"acbba",返回的應是"acb" 思路一:利用HaspMap,map的key存儲的是字元,value存儲的是字元當前的位置 1、如果當前字 ...
問題描述:給定一個字元串,找出這個字元串中最長的不重覆串。
比如:對於字元串"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 java.util.HashMap;
public class findLongestSubString {
public static void main(String[] args) {
String str = "120135435";
StringBuilder maxSubString = new StringBuilder("");
char[] strCharArr = str.toCharArray();
HashMap<Character, Integer> charsIndex = new HashMap<Character, Integer>();
int startIndex = 0, oriStartIndex = startIndex, maxLen = 0;
for(int index = 0; index < strCharArr.length; index++) {
if(charsIndex.containsKey(strCharArr[index])) {
int oriIndex = charsIndex.get(strCharArr[index]);
if(oriIndex >= startIndex){
startIndex = oriIndex + 1;
}
}
if(index - startIndex + 1 > maxLen) {
maxLen = index - startIndex + 1;
oriStartIndex = startIndex;
}
charsIndex.put(strCharArr[index], index);
}
for(int index = oriStartIndex; index < oriStartIndex + maxLen; index++) {
maxSubString.append(strCharArr[index]);
}
System.out.println(maxSubString.toString());
}