动态规划 最长无重复字符子串

91 阅读1分钟

题目

给定一个字符串,求其中没有重复字符的最长子串的长度,子串要求连续

  • 和递增子序列相比,该题还多了一个限制条件,i 位置的最长子串取决于 i-1 位置的最长子串和 i 位置字符之前出现位置相比,较短的那个
  • 因为 i-1 位置的最长子串不能保证里面没有和 i 位置重复的子串,所以还要和 i 位置之前出现的字符位置相比,取较短的那个
function process(str) {
  let res = 0,
    preIndex = -1, // i 位置字符之前出现的位置
    currentLen = 0, // 无重复字符子串长度
    map = {}; // 记录每个位置字符之前出现的位置

  for (let i = 0; i < str.length; i++) {
    preIndex = Math.max(preIndex, map[str[i]] || -1); // 获取 i-1 位置子串位置和 i 位置之前出现位置 最近(短)那个
    currentLen = i - preIndex; // 根据索引换算成长度
    res = Math.max(res, currentLen);
    map[str[i]] = i; // 记录 i 位置字符位置
  }

  return res;
}