算法题记录【华为od】最左侧冗余覆盖字串

题目描述

思路分析 

利用简易的窗口,以及map函数;总体思路为找到利用map函数找到题目所求字串的最右侧所在的位置,之后通过轮询找到窗口的开头

代码解析

let input1 = abt, input2 = abtabtff, input3 = 2, res = [], r = 0, l = 0, index = 0;
const m = new Map();
//运用map整合字符串 统计字符出现的次数
for (let i = 0; i < input1.length; i++) {
  const c = input1[i];
  m.set(c, m.has(c) ? m.get(c) + 1 : 1);
}
//题面给出的数组长度
let needType = m.size
//只有字符串2.length<字符串1.length的时候才触发
//轮询字符串2
while (r < input2.length) {
  const c = input2[r];
  if (m.has(c)) {
    m.set(c, m.get(c) - 1);
    //m.get(c) === 0 意味着当前字符已经退出循环 即当前字符在字符串1的最后一次出现的位置(按道理将map转换为字符串然后使用lastindexof也是可以的)
    if (m.get(c) === 0) needType -= 1;
  }
  //needType === 0的位置即为窗口的末尾值
  while (needType === 0) {
    const c2 = input2[l];
    //截取字符串
    let newRes = input2.slice(l, r + 1);
    if (res.length == 0 || newRes.length < res.length) res = newRes;
    //重复第一步操作 
    if (m.has(c2)) {
      m.set(c2, m.get(c2) + 1);
      //寻找首位最后一次次出现位置并跳出循环
      if (m.get(c2) === 1) needType += 1;
      if (needType == 1) index = l;
    }
    l++;
  }
  r++;
}
if (res.length > 0 && res.length <= input1.length + input3) {
  console.log(res=>, res);
} else console.log(=>, "-1");

后话

只是记录,正在找工作中,各位老板缺前端的可以私信,会vue,react,ts,js,22届本科毕业,一年工作经验

经验分享 程序员 微信小程序 职场和发展