题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
解法1:暴力解法
1 var lengthOfLongestSubstring = function(s) { 2 var n = s.length; 3 var maxlen=0; 4 var len = 0; 5 var str = ''; 6 7 if(s===''){ 8 return 0; 9 } 10 11 for(var i=0;maxlen<n-i+1;i++){ 12 for(var j=i;j<n;j++){ 13 str+=s[j]; 14 len++; 15 if(j+1===n){ 16 if(maxlen<len){ 17 maxlen=len 18 } 19 len = 0; 20 str = ''; 21 break; 22 } 23 if(str.indexOf(s[j+1]) !== -1){ 24 if(maxlen<len){ 25 maxlen=len 26 } 27 len = 0; 28 str = ''; 29 break; 30 } 31 } 32 } 33 return maxlen; 34 }
解法2:
1 let lengthOfLongestSubstring = function(s){ 2 s = s || ""; 3 let checkCharMap = {}; 4 5 let currentBeginIndex = 0; 6 7 let currentMax = 0; 8 for(let i=0; i<s.length; i++){ 9 if(s.length - currentBeginIndex <= currentMax){ 10 break; 11 } 12 13 let itemChar = s[i]; 14 15 if(checkCharMap[itemChar] === undefined){ 16 checkCharMap[itemChar] = i; 17 } 18 19 let lastIndex = checkCharMap[itemChar]; 20 checkCharMap[itemChar] = i; 21 if(lastIndex >= currentBeginIndex && lastIndex != i){ 22 currentBeginIndex = lastIndex + 1; 23 } 24 25 if(i - currentBeginIndex + 1 > currentMax){ 26 currentMax = i - currentBeginIndex + 1; 27 } 28 } 29 30 return currentMax; 31 }
解法3:
1 var lengthOfLongestSubstring = function(s) { 2 var len = s.length; 3 var arr=[],num=0,i=0,j=0; 4 for(;j<len;j++){ 5 if(arr.indexOf(s[j])!==-1){ 6 i = arr.lastIndexOf(s[j])+1; 7 arr.splice(0,i); 8 } 9 num = Math.max(num, arr.length+1); 10 arr.push(s[j]); 11 } 12 return num; 13 };
解法4:滑动优化窗口
1 var lengthOfLongestSubstring = function(s) { 2 const n = s.length; 3 let tempStr = ""; 4 let ans = 0; 5 let i = 0; 6 let j = 0; 7 while (j<n) { 8 if (tempStr.includes(s[j])) { 9 i = tempStr.lastIndexOf(s[j]) + 1 10 tempStr = tempStr.slice(i) 11 } 12 ans = Math.max(ans, tempStr.length + 1) 13 tempStr += s[j++] 14 } 15 16 return ans; 17 };
解法5:简单轻便
1 var lengthOfLongestSubstring = function(s) { 2 var ls = s.charAt(0); 3 var num = ls.length; 4 for(i=1;i <= s.length;i++){ 5 let index = -1; 6 index = ls.indexOf(s.charAt(i)) 7 if(index > -1){ 8 num = ls.length > num ? ls.length : num; 9 ls = ls.substr(index+1,s.length); 10 } 11 ls += s.charAt(i); 12 } 13 return num; 14 };