当前位置: 首页 > 面试经验 >

华为OD机试-寻找符合要求的最长子串(JavaScript)

优质
小牛编辑
95浏览
2023-03-28

华为OD机试-寻找符合要求的最长子串(JavaScript)

刚开始写技术文章,不合理的地方请谅解;算法都有详细的注释,请大家批评指正!!!

题目描述:给定一个字符串 s ,找出这样一个子串:

1)该子串中的任意一个字符最多出现2次;

2)该子串不包含指定某个字符;

请你找出满足该条件的最长子串的长度。

输入描述:

第一行为要求不包含的指定字符,为单个字符,取值范围[0-9a-zA-Z]

第二行为字符串s,每个字符范围[0-9a-zA-Z],长度范围[1,10000]

输出描述:

一个整数,满足条件的最长子串的长度;如果不存在满足条件的子串,则返回0

测试用例:输入:D abc123 输出:6 输入:D abaca123D 输出: 7


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;
};

#华为机试##23届找工作求助阵地#
 类似资料: