Longest Substring Without Repeating Characters leetcode java

愛做飯的小瑩子發表於2014-07-28

題目:

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

 

題解:

這道題下面的講解和程式碼完全引用http://blog.csdn.net/linhuanmars/article/details/19949159

 “原題連結: http://oj.leetcode.com/problems/longest-substring-without-repeating-characters/ 
這 道題用的方法是在LeetCode中很常用的方法,對於字串的題目非常有用。 首先brute force的時間複雜度是O(n^3), 對每個substring都看看是不是有重複的字元,找出其中最長的,複雜度非常高。優化一些的思路是稍微動態規劃一下,每次定一個起點,然後從起點走到 有重複字元位置,過程用一個HashSet維護當前字符集,認為是constant操作,這樣演算法要進行兩層迴圈,複雜度是O(n^2)。 
最 後,我們介紹一種線性的演算法,也是這類題目最常見的方法。基本思路是維護一個視窗,每次關注視窗中的字串,在每次判斷中,左視窗和右視窗選擇其一向前移 動。同樣是維護一個HashSet, 正常情況下移動右視窗,如果沒有出現重複則繼續移動右視窗,如果發現重複字元,則說明當前視窗中的串已經不滿足要求,繼續移動有視窗不可能得到更好的結 果,此時移動左視窗,直到不再有重複字元為止,中間跳過的這些串中不會有更好的結果,因為他們不是重複就是更短。因為左視窗和右視窗都只向前,所以兩個窗 口都對每個元素訪問不超過一遍,因此時間複雜度為O(2*n)=O(n),是線性演算法。空間複雜度為HashSet的size,也是O(n).

 程式碼如下:

 1 public int lengthOfLongestSubstring(String s) {
 2     if(s==null || s.length()==0)
 3         return 0;
 4     
 5     HashSet<Character> set = new HashSet<Character>();
 6     int max = 0;
 7     int walker = 0;
 8     int runner = 0;
 9     while(runner<s.length()){
10         if(set.contains(s.charAt(runner))){
11             if(max<runner-walker)
12                 max = runner-walker;
13             
14             while(s.charAt(walker)!=s.charAt(runner)){
15                 set.remove(s.charAt(walker));
16                 walker++;
17             }
18             walker++;
19         }else
20             set.add(s.charAt(runner));
21             
22         runner++;
23     }
24     max = Math.max(max,runner-walker);
25     return max;
26 }

 

相關文章