在使用两个指针的方法解决了Leetcode 392 Is Subsequence之后,我正在try 使用正则表达式来解决它.虽然这对较小的输入很有效,但当try 较大的输入时就会非常慢.

问题摘要

给定两个字符串s和t,如果s是t的子序列,则返回true,或者 否则为假.

字符串的子序列是由 通过删除一些字符(可以为None)来删除原始字符串 而不会干扰其余字符的相对位置. (即,"ace"是"abcde"的子序列,而"AEC"不是).

例1:

输入:S="abc",t="ahbgdc"输出:真示例2:

输入:S="axc",t="ahbgdc"输出:FALSE 约束条件:

0 = s.长度= 100 0 = t.长度= 10000 s和t仅由两个英文字母组成.

代码是这样的:

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isSubsequence = function (s, t) {
    if (s.length > t.length) {
        return false;
    }

    let regex_string = "\\w*";
    for (let i = 0; i < s.length; i++) {
        regex_string += s[i] + "\\w*";
    }

    const regex = new RegExp(regex_string);
    return regex.test(t);
};


let s = "rjufvjafbxnbgriwgokdgqdqewn";
let t = "mjmqqjrmzkvhxlyruonekhhofpzzslupzojfuoztvzmmqvmlhgqxehojfowtrinbatjujaxekbcydldglkbxsqbbnrkhfdnpfbuaktupfftiljwpgglkjqunvithzlzpgikixqeuimmtbiskemplcvljqgvlzvnqxgedxqnznddkiujwhdefziydtquoudzxstpjjitmiimbjfgfjikkjycwgnpdxpeppsturjwkgnifinccvqzwlbmgpdaodzptyrjjkbqmgdrftfbwgimsmjpknuqtijrsnwvtytqqvookinzmkkkrkgwafohflvuedssukjgipgmypakhlckvizmqvycvbxhlljzejcaijqnfgobuhuiahtmxfzoplmmjfxtggwwxliplntkfuxjcnzcqsaagahbbneugiocexcfpszzomumfqpaiydssmihdoewahoswhlnpctjmkyufsvjlrflfiktndubnymenlmpyrhjxfdcq";

isSubsequence(s, t);

如何在仍然使用正则表达式的情况下提高上述代码的性能?

推荐答案

\w*会导致大量回溯,您最好将"跳过"模式显式设置为[^ next-char]*:

var isSubsequence = function (s, t) {
    let regex_string = '';
    for (let c of s) {
        regex_string += '[^' + c + ']*' + c
    }


    const regex = new RegExp(regex_string);
    return regex.test(t);
};

let s = "rjufvjafbxnbgriwgokdgqdqewn";
let t = "mjmqqjrmzkvhxlyruonekhhofpzzslupzojfuoztvzmmqvmlhgqxehojfowtrinbatjujaxekbcydldglkbxsqbbnrkhfdnpfbuaktupfftiljwpgglkjqunvithzlzpgikixqeuimmtbiskemplcvljqgvlzvnqxgedxqnznddkiujwhdefziydtquoudzxstpjjitmiimbjfgfjikkjycwgnpdxpeppsturjwkgnifinccvqzwlbmgpdaodzptyrjjkbqmgdrftfbwgimsmjpknuqtijrsnwvtytqqvookinzmkkkrkgwafohflvuedssukjgipgmypakhlckvizmqvycvbxhlljzejcaijqnfgobuhuiahtmxfzoplmmjfxtggwwxliplntkfuxjcnzcqsaagahbbneugiocexcfpszzomumfqpaiydssmihdoewahoswhlnpctjmkyufsvjlrflfiktndubnymenlmpyrhjxfdcq";

console.time()
console.log(isSubsequence(s, t))
console.timeEnd()

如果字符串可能包含特殊的正则表达式字符,则需要正确转义这些字符.

Javascript相关问答推荐

React Native平面列表自动滚动

如何修复循环HTML元素附加函数中的问题?

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

如何从调整大小/zoom 的SVG路径定义新的d属性?""

如何从Intl.DateTimeFormat中仅获取时区名称?

在Three JS中看不到补间不透明度更改效果

如何在输入元素中附加一个属性为checkbox?

我怎么在JS里连续加2个骰子的和呢?

Reaction Native中的范围滑块

在我的index.html页面上找不到我的Java脚本条形图

让chart.js饼图中的一个切片变厚?

如何在DYGRAPS中更改鼠标事件和键盘输入

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

在不扭曲纹理的情况下在顶点着色器中旋转UV

FindByIdAndUpdate在嵌套对象中创建_id

用Reaction-RT-Chart创建实时条形图

表单数据中未定义的数组键

Plotly.js栏为x轴栏添加辅助文本

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题

需要从对象生成列表