LeetCode-无重复字符的最长子串

247 阅读1分钟

要解决的问题?

"abcabcbb" => 3 //无重复字符的最长子串是 "abc",长度为 3。

"abcabcbb" => 1 //无重复字符的最长子串是 "b",长度为 1。

"pwwkew" => 3  //无重复字符的最长子串是 "wke",长度为 3。

思路

转换字符串为字符数组C

创建空数组A用于存放从数组C中截取的非重复字符串

创建变量L用于存储较长字符串长度。

遍历字符数组C,根据当前遍历字符是否存在于数组A中,对数组A进行操作

如果存在  为保障数组A不包含数组C中截取的非重复字符串,需要截取重复字符之后的所有字符串重新赋值数组A,并将当前遍历字符压入,此操作压入一个字符删除至少一个字符所以操作后数组A的长度将小于等于上一次操作后数组A的长度,故L将维持上一次操作后数组A的长度不变。

如果不存在  则表明数组A中不存在当前遍历字符,可将当前字符压入,此操作看似数组A的长度将大于变量L,但存在上次遍历字符为重复字符,则变量L为上上次操作后数组A的长度,所以需要比较当前数组A长度和变量L大小,将较大者赋值给变量L,

经过上诉操作后变量L将保存字符数组C中的最长非重复字符串长度


/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  const strs = s.split(""), LongestArr = [];
  let LALength = 0;
  strs.map(str => {
    let LAIndex = LongestArr.indexOf(str);
    if (LAIndex < 0) {
      LongestArr.push(str);
      LALength = LongestArr.length > LALength ? LongestArr.length : LALength;
    } else {
      LongestArr.splice(0, LAIndex + 1);
      LongestArr.push(str);
    }
    return 0;
  });
  return LALength
};