1. 程式人生 > >【演算法題】查詢字串中無重複最長子串的長度

【演算法題】查詢字串中無重複最長子串的長度

在閱讀的過程中有任何問題,歡迎一起交流

QQ:1494713801

題目輸入是一個字串,找出沒有重複字元的最長子字串的長度

示例

abcabcbb最長子串(abc)長度為3  

bbbbbbb最長子串(b)長度為1

“abdevbac”最長子串(bdev)長度4

演算法思想

    設定兩個下標標識,初始時都位於陣列的頭部,並設定一個HashSet。標識runner先往後走,並將經過的字元放入HashSet中,當存在重複的字元時停止移動;此時,標識walker在後面追,直到walker的字元和runner的字元相同為止,此時walker與runner之間的字元是無重複的字串,將長度記錄為max。進行一遍遍歷後可以得到最長字串的長度值。

時間複雜度

兩個標識需要分別遍歷一遍,即2*N,故複雜度為:O(n)

程式碼實現

public int lengthOfLongestSubstring(String s) {
     if(s==null || s.length()==0)
         return 0;
     HashSet<Character> set = new HashSet<Character>();
     int max = 0;
     int walker = 0;
     int runner = 0;
     while(runner<s.length())
     {
         if(set.contains(s.charAt(runner)))
         {
             while(s.charAt(walker)!=s.charAt(runner))
             {
                 set.remove(s.charAt(walker));
                 walker++;
             }
             if(max<runner-walker)
             {
                 max = runner-walker;
             }
             walker++;
         }
         else
         {
             set.add(s.charAt(runner));
         }
         runner++;
     }
     max = Math.max(max,runner-walker);
     return max;
 }