算法题记录【华为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届本科毕业,一年工作经验
下一篇:
基础介绍-红黑树-数据结构