双下标的算法题

187 阅读1分钟

1.题目

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

示例1:

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

示例2:

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

代码实现

const lengthOfLongestSubstring = function(s) {
    let map = new Map(), max = 0
    for(let i = 0, j = 0; j < s.length; j++) {
        if(map.has(s[j])) {
            i = Math.max(map.get(s[j]) + 1, i)
        }
        max = Math.max(max, j - i + 1)
        map.set(s[j], j)
    }
    return max
};

2.题目

给定一个字符串,请你找出其中出现每个重复字符的 最长 长度。

示例1:

输入: "aabacc"
输出: { a: 2, b: 1, c: 2 }

示例2:

输入: "aabbbaaafbb"
输出: { a: 3, b: 3, f: 1 }

代码实现

const objOfRepeateString = (str) => {
  const strList = [...str];
  const len = strList.length;
  const obj = Object.create(null);
  let index = 0;
  for (let i = 1; i < len; i++) {
    const pre = strList[i - 1];
    if (strList[i] !== pre) {
      if(!obj[pre]) obj[pre] = i - index;
      else obj[pre] = Math.max(i - index, obj[pre]);
      index = i
    }
  }
  const last = strList[len - 1];
  obj[last] = obj[last] ? Math.max(len - index, obj[last]) : len - index;
  return obj;
}