使用javascript检查字符串是否是数组中字符串的组合

使用javascript检查字符串是否是数组中字符串的组合,javascript,arrays,string,algorithm,Javascript,Arrays,String,Algorithm,我需要检查字符串是否由数组中给定的任何字符串组合构成 示例:我们有一个数组[“for”、“car”、“keys”、“forth”]和一个字符串“forthcarkeys”,结果应该是true。如果字符串是“forthcarxykeys”,结果应该是false,因为xy不在数组中。数组中单词的顺序并不重要。 不必匹配数组中的所有字符串,但teststring只应由数组中的任何字符串组成。如果它包含数组中的字符串以外的任何字符串,则返回false 我的做法: var str = "forthcark

我需要检查字符串是否由数组中给定的任何字符串组合构成 示例:我们有一个数组[“for”、“car”、“keys”、“forth”]和一个字符串“forthcarkeys”,结果应该是true。如果字符串是“forthcarxykeys”,结果应该是false,因为xy不在数组中。数组中单词的顺序并不重要。 不必匹配数组中的所有字符串,但teststring只应由数组中的任何字符串组成。如果它包含数组中的字符串以外的任何字符串,则返回false

我的做法:

var str = "forthcarkeys";
var arr = ["for","car","keys","forth"];
for(var i=0;i<arr.length;i++)
{
   if(str.indexOf(arr[i]) !== -1)
   {
      str.replace(arr[i],"");
   }
}

if(str !== "")
{
  console.log("yes");
} else 
{
  console.log("no");
}
var str=“forthcarkeys”;
var arr=[“for”、“car”、“keys”、“forth”];

对于(var i=0;i您需要
按长度对数组排序
Dec
顺序,如果
yes
的条件为
str==”

功能检查(str){
var arr=[“for”、“car”、“keys”、“forth”];
arr=arr.sort((a,b)=>b.length-a.length)//按长度dec顺序排序
console.log(arr)//最长的字符串先是,然后是较低的长度
对于(变量i=0;i检查(“forthcarxykeys”)
这里是更新的代码。字符串替换不起作用,因此使用regex来实现这一点。
var re=new RegExp(arr[i],'g');

功能检查(str、arr){
var标志=真;
对于(变量i=0;i检查(str,arr);
一种可能的方法是检查每个前缀是否可以使用输入字符串表示

其思想是,如果我们可以轻松计算长度为i的前缀是否可以用输入字符串表示,如果我们已经有了较短前缀的信息(这可以通过检查是否有任何允许的字符串导致较短的可表达前缀来完成)——请参阅下面的代码

var str=“forthcarkeys”;
var arr=[“for”、“car”、“keys”、“forth”];
//isPossible[i]表示我们是否可以表示
//使用arr中的字符串作为str.substring(0,i)的前缀。
var isPossible=数组(str.length+1).fill(false);
//总是可以构造空字符串
isPossible[0]=真;
/考虑STR的每个前缀,从最短到最长
对于(变量i=1;i=0&&isPossible[start]){
if(str.substring(start,i)==arr[j]){
i可能[i]=真;
//我们打破了j上的循环,因为我们已经找到了一个
//表示当前前缀str.substring(0,i)的解决方案
打破
}
}
}
}

对于(var i=1;i如果首先匹配所有单词,则可以在开始时忽略不出现的单词。然后,如果匹配在字符串中按出现顺序排列,则可以使用递归查找匹配后的所有匹配:

function eval(str,wordList=[“for”,“car”,“keys”,“forth”,“the”]){//注意,添加了“the”用于测试
如果(!str)返回false;//空字符串->false
const words=wordList.map(w=>({word:w,index:str.indexOf(w)}))//将所有单词及其出现索引映射到字符串中
.filter(w=>w.index!=-1)//一起去掉不出现的单词
.sort((w1,w2)=>w1.index-w2.index);//按发生的索引排序
常量检查=(arr,ind)=>{
if(ind>=str.length)返回ind==str.length;//已到达字符串的结尾->如果正好在末尾匹配(如果大于则为false)
让w;
while(arr.length){
[w,…arr]=arr;//解构:w=下一个单词(索引0),arr设置为剩余元素
如果(w.index>ind)返回false;//距离上次匹配->无匹配
如果(w.index==ind&&check(arr,ind+w.word.length))//如果匹配在预期索引处,请检查下一个索引
return true;//单词从“current”索引开始,其余单词也匹配
//如果代码到达此处,请进一步尝试下一个单词(while)
}
返回false;
};
返回检查(单词,0);//使用字符串索引0处的所有单词启动递归函数
}
//试验
功能测试(str,words){
console.log(str',:',eval(str,words));
}
测试(“forthcarkeys”);
测试(“forthcarxykeys”);
测试(“forthecar”);

测试(“abcdef”,“abc”,“def”,“abcd”]);
您可以进行扩展尝试,搜索每个单词,并使用临时结果集过滤掉字符串中的单词

函数检查(字符串、数组){
功能叉(i,t){
var s=t.slice(),j;
if(i==可能性.length){
结果:推(t.join(“”));
返回;
}
if(可能性[i].word.split(“”).every(函数(c,j){返回s[j+可能性[i].position]!=“”;})){
对于(j=0;j<可能性[i].word.length;j++){
s[j+可能性[i]。位置]=''
}
}
叉(i+1,s);
叉(i+1,t);
}
变量可能性=数组.reduce(函数(r,a){
var p=字符串。indexOf(a);
而(p!=-1){
r、 推(字:a,位置:p});
p=string.indexOf(a,p+1);
}
返回r;
}, []),
结果=[];
console.log(可能性);
fork(0,string.split(“”));
控制台日志(结果);
返回结果.some(函数(a){return!a;});
}
console.log(检查(“forthcarkeyboardingfor“,[“for”,“car”,“key”,“forth”,“keyboard”,“boarding”]));//true
控制台日志(检查“FORTHXYCARKEYBOARINGFOR”,“for”,“car”,“ke
// arr = ["for", "car", "keys", "forth"];
// str = "forthcarxykeys";

function check(arr, str) {
    let chars = str.split('');
    for (let i = 0; i < arr.length; i++) {
        let word = arr[i];
        let index = str.indexOf(word);
        let wordExists = index !== -1;
        if (wordExists) {
            let endIndex = index + word.length;
            for (index; index < endIndex; index++) {
                chars[index] = true;
            }
        }
    }
    return chars.every(i => i === true);
}