关于 最长的子字符串不重复字符 相关js算法问题

题目 

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring"pwke" is a subsequence and not a substring.

由题可知是求 一个字符串中连续不重复字符的最大长度

我的思路

我的写法 虽然是对的但太麻烦。下边是习题后边优秀的解答

return s.split('').reduce((ret, val, index) => {
    if(ret.indexOf(val) >= 0) return ret;
    ret.push(val);
    return ret;
}, []).length;

这是一个错误的解答 在s="abcabcbb";时正确。s="pwwkew" 是错误。

分析上述代码 我对JavaScript 只是初步了解 首先了解其中涉及的一些方法

.split('') 将一个字符串分解成字符串数组 s.split('') 将s字符串切割成一个字符一个字符的数组

.reduce(function(total,currentValue,currentIndex,arr),initialValue) .reduce() 数组求和

.indexOf()  查询某个字节是否出现 

该题  只是查出字符串中所有不重复的字母 。跟题意所要求的不符合

下边是一个正确的解

var lengthOfLongestSubstring = function(s) {
     let result = '';
     let tempResult = '';
     for(let i=0; ilength; i++){
         if(tempResult.indexOf(s[i]) == -1) {  // 当tempResult中不含有s[i]时
             tempResult += s[i];       // 所有不重复的字符放入tempResult中
             if(tempResult.length > result.length) {  //当tempResult的长度大于result的长度时 使result=tempResult
             result = tempResult;
             }
         } else {                                // 当tempResult中含有s[i]时
             if(tempResult.length > result.length) {
                 result = tempResult;
             }
             let index = tempResult.indexOf(s[i]);  //返回tempResult 重复的位置
             tempResult = tempResult.slice(index+1) + s[i];  //  当出现重复字符时对tempResult 重新赋值 从重复的字符之后到结束加上重复的字符

         }
     }
     return result.length ;
 };
该解逻辑1 从字符串s的第一位开始找第一个连续不重复最长的字符串,命名为tempResult 并把它赋值给result
2  当 s 中出现重复的字符时 将tempResult 从重复字符开始切割并加上重复的字符 并赋值给tempResult 由于这个字符串是切割后的
 必然不大于Result 
3 从重复位置开始继续添加不重复的字符,组成另一个从重复位置之后的 另一个连续不重复最长的字符 ,每次tempResult增长后都与Result
相比较,并把最长的赋值给Result。

    4 当tempResult 再一次重复时 与上个连续不重复最长的字符串 相比较,把长的赋值给result 

5 则 最后 获得 连续不重复最长的字符串 即为 result  返回其长度




你可能感兴趣的:(算法学习记录)