测试String是否包含构成另一个字符串的所有字符

时间:2016-07-23 19:29:56

标签: javascript regex string algorithm

我正在尝试使用Javascript来查看某个字符串是否包含构成另一个字符串的所有字符。

例如,"你好"包含组成单词的所有字符" hell。"此外," hellowy"包含构成单词"黄色的所有字符。"

最重要的是,无论两个字符串中的字符顺序如何,该方法都需要工作。另外,字符数很重要。 "赫尔"不包含所有字符组成" hell。"这严格指的是人物的数量:一个人需要两个人来制作单词"地狱"和" hel"只有一个。

进一步澄清这个问题,我不担心我是否留下了一些"未使用的"从字符串的字符组成子字符串后的字符。也就是说," helll"仍然应该包含单词的所有字母" hell。"

如何有效地完成这项工作?也许有一个正则表达式解决方案?速度有点问题,但并非绝对关键。

4 个答案:

答案 0 :(得分:2)

您可以使用every

function test(string, substring) {
    var letters = [...string];
    return [...substring].every(x => {
        var index = letters.indexOf(x);
        if (~index) {
            letters.splice(index, 1);
            return true;
        }
    });
}

Every将在第一个假值中失败,然后它不会搜索每个字母。

答案 1 :(得分:1)

修改,更新

  

此外,字符数很重要。 "赫尔"不含   所有要填补的角色"地狱。"

您可以使用变量存储Boolean值,for..of循环,String.prototype.indexOf()检查,设置Boolean变量,break循环{{1 }}。

您还应该能够检查输入字符串false是否等于.length条件下的匹配字符串.length,如果两个字符串{{则将变量设置为if 1}}属性不相等。

false

答案 2 :(得分:1)

如果字母数量很重要,那么可能是这样的:

function test(string, substring) {
    var regexp = new RegExp(substring.split("").sort().map(function(s) { return s + "+"; }).join(""));
    return regexp.test(string.split("").sort().join(""));
}

这比上面的答案慢,但是如果字符串中有一些重复,那么就可以缓存并获得比其他答案更好的速度性能:

var cache1 = { };
var cache2 = { };
function test2(string, substring) {
    var regexp = cache1[substring];
    if (!regexp) {
        regexp = new RegExp(substring.split("").sort().map(function(s) { return s + "+"; }).join(""));
        cache1[substring] = regexp;
    }

    var string2 = cache2[string];
    if (!string2) {
        string2 = string.split("").sort().join("");
        cache2[string] = string2;
    }

    return regexp.test(string2);
}

答案 3 :(得分:1)

进行一些训练我想出了这个东西:

function test(str, substring) {
  var arr_str = str.toLowerCase().split('');
  var arr_substr = substring.toLowerCase().split('');

  return arr_substr.filter(function(each) {
    return arr_str.indexOf(each) === -1;
  }).length === 0;
}

console.log(test("Alien", "line")); // true
console.log(test("Hello", "hello")); // true
console.log(test("hello", "hey")); // false