我正在尝试使用Javascript来查看某个字符串是否包含构成另一个字符串的所有字符。
例如,"你好"包含组成单词的所有字符" hell。"此外," hellowy"包含构成单词"黄色的所有字符。"
最重要的是,无论两个字符串中的字符顺序如何,该方法都需要工作。另外,字符数很重要。 "赫尔"不包含所有字符组成" hell。"这严格指的是人物的数量:一个人需要两个人来制作单词"地狱"和" hel"只有一个。
进一步澄清这个问题,我不担心我是否留下了一些"未使用的"从字符串的字符组成子字符串后的字符。也就是说," helll"仍然应该包含单词的所有字母" hell。"
如何有效地完成这项工作?也许有一个正则表达式解决方案?速度有点问题,但并非绝对关键。
答案 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