題目:算法
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。網絡
題解:數據結構
看到判斷是否重複,咱們首先應該想到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]); } } }