刚开始写技术文章,不合理的地方请谅解;算法都有详细的注释,请大家批评指正!!!
题目描述:给定一个字符串 s ,找出这样一个子串:
1)该子串中的任意一个字符最多出现2次;
2)该子串不包含指定某个字符;
请你找出满足该条件的最长子串的长度。
输入描述:
第一行为要求不包含的指定字符,为单个字符,取值范围[0-9a-zA-Z]
第二行为字符串s,每个字符范围[0-9a-zA-Z],长度范围[1,10000]
输出描述:
一个整数,满足条件的最长子串的长度;如果不存在满足条件的子串,则返回0
测试用例:输入:D abc123 输出:6 输入:D abaca123D 输出: 7
#华为机试##23届找工作求助阵地#
var findString= function (s) {
// 不含指定符号的最长子串
/**
* 思路:1.双指针(滑动区间)遍历元素
* 2.使用map函数记录符号出现次数;
* 3.若不符合(指针后移,元素对应-1),继续遍历
*/
// 定义最大长度和开始指针
let len = 0,
i = 0;
let map = new Map();
// 初始化map,设置不包含元素为最大值,保证其不存在数组里
map.set("D", 2);
// 使用后指针遍历
for (let j = 0; j <= s.length; j++) {
// 符号出现一次的时候记录
if (!map.has(s[j])) {
map.set(s[j], 1);
}
let n = map.get(s[j]);
// 符号未超过两次,继续记录
if (n < 2) {
map.set(s[j], n + 1);
} else {
// 符号出现两次后,记录长度,元素-1;指针后移
len = Math.max(len, j - i);
map.set(s[j], n - 1);
i++;
}
// 记录一次最大长度
len = Math.max(len, j - i);
}
return len;
};