求字串中不包含重複字元的最長子串的長度
阿新 • • 發佈:2019-01-02
題:
已知一個字串,求這個字串中不包含重複字元的最長子串的長度,如abba返回2,aaaaabc返回3,bbbbbbb返回1.
解題思路:
藉助hashmap來解決,map的鍵key存放字串中出現的字元,值value存放該字元當前的位置。
首先建立一個頭指標now,指向當前子串的開頭,maxLength儲存當前最大長度;剛開始,now指向字串的第一個字元,隨著遍歷字串,如果map中不包含當前字元,那麼now不變,用字元當前位置和now的位置相減,然後再與最大長度進行比較,更新maxLength;再將當前字元以及它的位置儲存到map中;如果map中包含當前字元,則需改變頭指標now所指的位置(將頭指標當前位置與map中當前字元所存位置的下一個位置進行比較,選擇最大者作為最新頭指標所指位置),然後再更新maxLength;不管map中有無當前字元,都需在map中更新,記錄字元最近出現的位置。
比如:abba
(1)初始:maxLength=0;
(2)abba:map中不含該字元, now 指向第一個a; map中新增該字元及其位置,<a,0>; maxLength=1;
(3)abba: map中不含該字元,now指向第一個a; map中新增該字元及其位置,<b,1>; maxLength=2;
(4)abba: map中含有相同字元b,now更新,指向2 { [(map中b的位置為1 ) +1 ] > (now=0)};map中更新該字元及其位置,<b,2>; maxLength=1;
(5)abba: map中含有該字元,更新map種該字元最新位置,<a,3>;now指向第二個b,maxLength=2;
程式碼如下:
import java.util.HashMap; import java.util.Map; public class LongestNoRepeatCharactorSubstring { //求最長無重複字元子串 public static int lengthOfLongestSubstring(String s){ Map<Character,Integer> map = new HashMap<Character,Integer>(); //map中的鍵key存放字串中出現的字元,值value存放該字元當前的位置 int maxLength = 0; //儲存最長字串長度 int now = 0; //記錄頭指標位置 for(int i=0; i<s.length(); i++ ){ if(map.containsKey(s.charAt(i))){//如果map中已存在當前字元 now = Math.max(now, map.get(s.charAt(i))+1);//更新當前指標位置,如果當前指標大,則使用當前指標,否則使用該指標下一個字元的位置 if((i-now+1) > maxLength){ maxLength = i-now+1; } }else{ //map中不存在當前字元 if((i-now+1) > maxLength){ //更新最長字串的長度 maxLength = i-now+1; } } map.put(s.charAt(i), i);//修改當前字元的value,記錄最新位置 } return maxLength; } public static void main(String[] args) { String s = "abba"; System.out.println(lengthOfLongestSubstring(s)); }