关于力扣第三题 ---无重复字符的最长子串

题目描述:

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 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     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 };

解法4:简单轻便

 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 };

猜你喜欢

转载自www.cnblogs.com/myfate/p/10443623.html