求字串中不含重複字元的最長子串

wangbiao007發表於2020-04-05

今天逛脈脈,在上面看到一個求字串中不含重複字元的最長子串,如果突然看到這個題,當時真的是寫不出,更何況最優解了,這個題以前出去面試的時候被考到過,當時也沒有寫出來,所以在網上看了這道題的答案後自己試著寫了下,並將自己的理解記錄下來
  總體思路:

 1.設定兩個遊標,一左一右,剛開始都設定成0,設定一個set,用來存放不含重複字串的子字串;

 2.從零的位置開始遍歷字串,如果set裡面不含這個字元就將這個字元放入set中,右遊標右移一位,通過左右遊標獲取最長的字串,最後一次出現的就是所求的不重複最長子字串

 3.如果遍歷的字元已經存在set中了,那就啟動左遊標,找到重複字元第一次出現的位置,在尋找的過程中,將重複字元第一次出現的位置之前的字元都去掉,只到找到將重複字元第一次出現的位置後,再啟動右遊標開始擴充

public static int getMaxLength(String str){
       int length = str.length();
       int i=0;//右遊標
       int j=0;//左遊標
       int maxLength = 0;
       //用於儲存不重複的字元
       HashSet<String> hashSet = new HashSet<>();
       while(i<length&&j<length){
            String end = str.substring(i,i+1);
           /**
            * 當字元沒有重複的時候,右遊標i往右前進一位
            */
           if(!hashSet.contains(end)){
                hashSet.add(end);
                i++;
                if(i-j>maxLength){
                    maxLength = i-j;
                    System.out.println("最大子字串:"+str.substring(j,i));
                }
            }else{
               /**
                * 當字串有重複的時候,就得找到重複字元第一個出現的位置,
                * 並將左遊標j移到重複字元第一個出現的位置後面一位,
                * 然後再來擴充套件右遊標
                */
                String start = str.substring(j,j+1);
                hashSet.remove(start);
                j++;
            }
        }
        return maxLength;
    }
public static void main(String[] args) throws Exception {

        int maxlengtn = getMaxLength("abcabcbbqwertykokj");
        System.out.println("最長長度是:"+maxlengtn);
    }

輸出結果:
 

最大子字串:a
最大子字串:ab
最大子字串:abc
最大子字串:bqwe
最大子字串:bqwer
最大子字串:bqwert
最大子字串:bqwerty
最大子字串:bqwertyk
最大子字串:bqwertyko
最長長度是:9

 

相關文章