题目:算法
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。网络
题解:数据结构
看到判断是否重复,咱们首先应该想到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]); } } }