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

2skhul33  于 2023-03-21  发布在  Java
关注(0)|答案(5)|浏览(153)

我试图使用Javascript来查看某个字符串是否包含构成另一个字符串的所有字符。
例如,单词“hello”包含组成单词“hell”的所有字符,单词“hellowy”包含组成单词“yellow”的所有字符。
最重要的是,无论两个字符串中的字符顺序如何,该方法都需要工作。此外,字符的数量很重要。“Hel”并不包含组成“hell”的所有字符。这是指严格的字符数量:单词hell需要两个l而hel只有一个l。
进一步澄清这个问题,我不担心在从字符串的字符组成子串之后留下一些“未使用”的字符,也就是说,“hell”仍然应该包含单词“hell”的所有字母。
我如何有效地完成这一点?也许有一个正则表达式的解决方案?速度是一个问题,但不是绝对关键的。

c9x0cxw0

c9x0cxw01#

您可以使用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将在第一个falsy值中失败,然后它不会搜索 * 每个 * 字母。

uwopmtnx

uwopmtnx2#

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

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

pzfprimi3#

编辑、更新
此外,字符的数量也很重要。“Hel”并不包含组成“Hell”的所有字符
你可以使用一个变量来存储Boolean值,for..of循环,String.prototype.indexOf()检查,设置Boolean变量,break循环,如果false
您还应该能够包括检查输入字符串.length是否等于if条件下的匹配字符串.length,如果两个字符串.length属性不相等,则将变量设置为false

var str = "hell";
var match = "hel";
var bool = true; 
for (var prop of str) {
  if (str.length !== match.length || match.indexOf(prop) === -1) {
    bool = false; break;
  }
};
console.log(bool); // false
0ve6wy6x

0ve6wy6x4#

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

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
ryoqjall

ryoqjall5#

我尝试了一些东西,依靠别人的评论,并得出了这个结论。它基本上每次子字符串中的一个字母返回正索引值时都使用count变量,然后检查总计数是否等于子字符串的长度(* 逻辑是任何返回-1的字母都不存在并且不会被计数 *)。如果计数相等,则所有的字母都通过了测试,如果没有,则测试失败。
它适用于反向字母,子字符串中重复的字母(即'heell'作为子字符串也会通过'hello'的测试。

function test(str, substring) {
    let str1 = str.toLowerCase();
    let str2 = substring.toLowerCase();
    let count = 0;
    let answer = false;

    for(let i of str2){
        if(str1.indexOf(i) >= 0) {
            count+=1;
        }
    }
    return str2.length == count ? answer = true : answer;
}

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

相关问题