無重複字符的最長子串

題目:算法

  給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。網絡

題解:數據結構

  看到判斷是否重複,咱們首先應該想到Set,由於Set存儲的是無重複的、無排序的元素。假如看到統計元素的個數,首先應該想到Map,只有使用了對的數據結構,才能使得咱們的代碼的運行效率更高,時間複雜度更低。在空間和時間的取捨上,咱們一向的思惟是空間換時間,畢竟韶光易逝不復返,但機器硬件咱們是能夠堆砌出來的。spa

  在計算器網絡中,滑動窗口機制相信咱們都有所瞭解,它是TCP/IP的可靠傳輸的保證機制。子串的含義是字符之間的位置要是連續的、有序的(相對位置不變),這偏偏符合滑動窗口的思想。因此,接下里咱們就來是滑動窗口算法來解決此題。code

  1.使用Set來判斷字符是否有重複blog

  2.假如字符有重複,那麼就將窗口的左邊界移到到重複字符的下一個位置,這樣就能保證窗口中的字符構成的是無重複字符的、有序的子串。下面上代碼:排序

Java版本rem

public int lengthOfLongestSubstring(String s) {
        if(s == null || s.length() == 0) return 0;
        
        int maxLen = 0;
        for(int i=0;i<s.length();i++){
            //滑動窗口 Set
            Set<Character> set = new HashSet<Character>();//判斷是否有重複
            set.add(s.charAt(i));
            for(int j=i+1;j<s.length();j++){
                char c= s.charAt(j);
                if(!set.contains(c)) set.add(c);
                else{//有重複的元素
                    maxLen = Math.max(maxLen,set.size());
                    //刪除重複的元素,即將窗口的左邊界移到到重複字符的下一個位置
                    while(set.contains(c)){
                        set.remove(s.charAt(i++));
                    }
                    set.add(c);
                }
            }
            maxLen = Math.max(maxLen,set.size());
        }
        return maxLen;

    }

JS版本字符串

var lengthOfLongestSubstring = function(s){
    if(!s || s.length ==0){
        return 0;
    }
    var j =0,i = 0,maxLen = 0;
    var set = new Set();
    for(i;i < s.length;i ++){
        if(!set.has(s[i])){
            set.add(s[i]);
            maxLen = Math.max(maxLen,set.size);
        }else{//將窗口的左邊界移到到重複字符的下一個位置
            while(set.has(s[i])){
                set.delete(s[j]);
                j++;
            }
            set.add(s[i]);
        }
    }
}
相關文章
相關標籤/搜索