leetcode 之每日刷题_无重复字符的最长子串

字符串操作
题目 #3

题目描述:

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

示例 1:

输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:

输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:

输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

反省

做这题的时候我脑子抽筋了,一没看到是子串(ps:我开始当子序列做的,没看注意当时找了半天都不知道哪错了)二:没有考虑空串和空格串
我这个题做的我都感觉难受了,我现在也没心情优化代码了

说下思路吧

先准备一个可以放小串的东西,我把它命名为变量a数组了。在准备一个小串数组。
这里我把字符串也变成一个数组来操作了
接下来循环字符串数组,里面拿字符串数组的当前循环值去小串数组里的值进行匹配。没有匹配到就把它加入小串。
重点是匹配到了,即小串中有当前这个循环值,我们就把已经生成的小串扔给a。重置小串。
我觉得重置小串是这个题重点,我们要找到小串中的那个与当前循环值匹配的那个值的索引。把小串中0-这个索引的元素都整出去就ok了

本题复习相关方法
string:
split:转数组(可加分割符)
Array
forEach:数组遍历
includes:找数组元素
indexOf:找目标索引
slice:抽取数组

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let max;
    if (s == "") {
        return max = 0;
    } else if (s == " ") {
        return max = 1;
    }
    let cont = [];
   	let a = [];
    let b = [];
    //我比较喜欢换成数组去做
    let textArr = s.split("");

    textArr.forEach(ele => {
        //肯定是有内层循环的,用我们的子串数组去比
        //找到一个就是ture
        if (cont.includes(ele)) {
            // 先把找到的子串组扔出去
            a.push(cont);
            //下来考虑重置的子串组
            // 找到有重的了,那么就要知道重复的那个在子串的位置
            let index = cont.indexOf(ele)
            cont = cont.slice(index + 1);
            cont.push(ele);
        } //一个没找到
        else {
            // 没重的加入子串数组
            cont.push(ele);
        }

    });
    a.push(cont);

    a.forEach(e => {
        b.push(e.length);
    });
    max = b[0];
    for (let i = 1; i < b.length; i++) {
        if (max < b[i]) {
            max = b[i];
        }
    }
    return max;
};

你可能感兴趣的:(力扣刷题,leetcode,算法,字符串)