3. 无重复字符的最长子串

2020-03-12
无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: abcabcbb
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: pwwkew
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
说明:
  • 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解:
思路1:双指针暴力解
两个for循环暴力拆解。for中套for效率特别低。
 
var lengthOfLongestSubstring = function (s) {
  let obj = {}; // 声明一个对象用s[i]作为key存储当前记录中有哪些字符串
  let len = 0; // obj中记录的key的长度
  let result = 0; // 返回的最长字串长度
  for (let i = 0; i < s.length; i++) { // 第一个指针
    obj[s[i]] = true; // 每次更新第一个指针先把当前s[i]作为obj的第一个key存进去
    len = 1; 
    for (let j = i + 1; j < s.length; j++) { // 第二个指针 从i之后开始遍历
      if (!obj[s[j]]) { // 如果obj中没有记录则记录进去
        obj[s[j]] = true;
        len++;
        result = Math.max(result, len); // 当遍历到s.length时需要取一次最大值 所以写这一条
      } else {
        result = Math.max(result, len); // 如果obj中已经有了这个key则说明重复了,取较大值作为result
        obj = {}; // 将obj清空
        break; // 退出第二指针
      }
    }
  }
  return Math.max(result, len);
}
思路2:滑动窗口
用一个子数组记录存入的子字符串,每次循环一个新的子字符串都判断数组中是否存在
 
function lengthOfLongestSubstring(s) {
  if (s.length < 2) { // 如果s的长度小于2直接返回就行了
    return s.length;
  }
  s = s.split(''); // 将s打散成数组
  let sonArr = []; // 记录无重复字串的子数组
  let len = 0; // 记录最大长度
  for (let i = 0; i < s.length; i++) { // 循环s
    let index = sonArr.indexOf(s[i]); 
    if (index < 0) { // 如果子数组中没有,直接push进去
      sonArr.push(s[i]);
    } else { 
      len = Math.max(sonArr.length, len); // 如果子数组中已经存在当前的s[i], 
                         // 那么获取当前子数组长度和len的长度比较,取较大值赋值len
sonArr.splice(0, index + 1); // 由于子数组是无重复字串的数组,出现重复的项则要把原来项之前的去掉才能放进重复项 sonArr.push(s[i]); // 子数组已经把上一次出现的s[i]截取了,把新出现的s[i]插入 } } return Math.max(sonArr.length, len); }
原文地址:https://www.cnblogs.com/lanpang9661/p/12467111.html