1. 程式人生 > >3.Longest Substring Without Repeating Characters

3.Longest Substring Without Repeating Characters

right lan ring 字符 class cte hide get 包括

題目鏈接:https://leetcode.com/problems/longest-substring-without-repeating-characters/description/

題目大意:找出一串字符串的無重復子串。例子如下:

技術分享

法一:兩層for循環,一個字符一個字符的遍歷其後是否有子串,且要判斷是否不重復。這裏有幾個細節點,map的使用判斷是否有重復,string.charAt(index)的使用摘出某一個字符。代碼如下(耗時206ms):

技術分享
 1     public int lengthOfLongestSubstring(String s) {
 2         int length = 1;
3 int max = 0; 4 for(int i = 0; i < s.length(); i++) { 5 length = 1; 6 Map<Character, Integer> map = new HashMap<Character, Integer>(); 7 map.put(s.charAt(i), i); 8 for(int j = i + 1; j < s.length(); j++) { 9 if
(map.containsKey(s.charAt(j)) == false) { 10 //如果前面的字符串中沒有當前字符,則將當前字符加入字符串中 11 length++; 12 map.put(s.charAt(j), j); 13 } 14 else { 15 //如果有,則直接退出從當前字符串起始位置的下一個位置開始重新計算字符串 16 //
這裏就有優化的地方了 17 break; 18 } 19 } 20 if(length > max) { 21 max = length; 22 } 23 } 24 return max; 25 }
View Code

法二(借鑒):一層for循環,用left記錄子串起始位置,用set判斷是否有重復,每走到下一個下標位置,判斷當前存的子串中有沒有當前字符,如果有,則根據left++將重復字符前面的包括它自己都從set中刪去,也就是將重復字符+1作為新的子串的起始位置;如果沒有,則將當前字符加入子串中。有點kmp的思想,這樣只需要一次for循環即可。代碼如下(耗時70ms):

技術分享
 1     public int lengthOfLongestSubstring(String s) {
 2         int length = s.length();
 3         int left = 0, right = 0, ans = 0;//left記錄子串開始下標,right記錄子串結束下標
 4         HashSet<Character> set = new HashSet<Character>();//set判斷重復字符
 5         while(right < length) {
 6             if(set.contains(s.charAt(right)) == false) {
 7                 //前面的字符串中不包含當前字符
 8                 //將當前字符加入子串中,長度+1
 9                 set.add(s.charAt(right++));
10                 ans = Math.max(ans, set.size());
11             }
12             else {
13                 //前面的字符串中包含當前字符
14                 //將重復字符前面的包括它自己都刪去,也就是從重復字符+1開始重新計算子串
15                 set.remove(s.charAt(left++));
16             }
17         }
18         return ans;
19     }
View Code

還有別的方法,還沒太看懂https://leetcode.com/problems/longest-substring-without-repeating-characters/solution/

3.Longest Substring Without Repeating Characters