Javascript 检查是否存在任意数量的字符串组合

Javascript 检查是否存在任意数量的字符串组合,javascript,Javascript,我正在解决一个难题,我有一个如何解决这个问题的想法,但我想得到一些指导和提示 假设我有以下内容,给定n个要输入的单词数量,以及m个没有空格的单词组合,我将有如下功能 4 this is my dog 5 thisis // outputs 1 thisisacat // 0, since a or cat wasnt in the four words thisisaduck // 0, no a o

我正在解决一个难题,我有一个如何解决这个问题的想法,但我想得到一些指导和提示

假设我有以下内容,给定n个要输入的单词数量,以及m个没有空格的单词组合,我将有如下功能

    4
    this
    is
    my
    dog
    5
    thisis        // outputs 1
    thisisacat    // 0, since a or cat wasnt in the four words
    thisisaduck   // 0, no a or cat
    thisismy      // 1 this,is,my is amoung the four words
    thisismydog   // 1
我的想法

首先,我想做的是将这些第一个单词存储到一个数组中。然后,我检查这5个单词中是否有任何一个是第一个单词

示例:检查这是否在第一个单词thisis中。它是!很好,现在删除这个,从这里得到简单的是,现在删除对应于这个等式的原始字符串,继续迭代剩余的,现在是,我的,狗可用了。如果我们能继续这样做,直到得到一个空字符串。我们返回1,否则返回0


我的想法正确吗?我想这将是一个很好的方法,我想用javascript实现这一点,把这4个单词放到正则表达式中。 使用该正则表达式拆分每个字符串。 将结果数组的长度减去1作为1的初始长度

var size = 'thisis'.split(/this|is|my|dog/).length - 1
或者如果你的单词列表是一个数组

var search = new RegExp(words.join('|'))
var size = 'thisis'.split(search).length - 1
无论哪种方式,您都是按定义的单词列表拆分字符串

您可以按长度对单词进行排序,以确保较大的单词首先与

words.sort(function (a, b) { return b.length - a.length })

这是任何感兴趣的人的解决方案

var input = ['this','is','a','string']; // This will work for any input, but this is a test case
var orderedInput = input.sort(function(a,b){
    return b.length - a.length;
});
var inputRegex = new RegExp(orderedInput.join('|'));
// our combonation of words can be any size in an array, just doin this since prompt in js is spammy
var testStrings = ['thisis','thisisastring','thisisaduck','thisisastringg','stringg']; 
var foundCombos  = (regex,str) => !str.split(regex).filter(str => str.length).length;
var finalResult = testStrings.reduce((all,str)=>{
    all[str] = foundCombos(inputRegex,str);
    if (all[str] === true){
        all[str] = 1;
    }
    else{
        all[str] = 0;
    }
    return all;
},{});
console.log(finalResult);

在某些情况下,将单词从长到短排序可能有助于更快地找到解决方案,但这并不能保证。包含最长单词的句子可能只有在不使用最长单词的情况下才有解决方案

以这个测试用例为例:

关键词:工具箱、凳子、拳击手 句子:工具箱

如果“工具箱”在该句子中被视为一个单词,则剩余字符不能与其他有效单词匹配。然而,只有在不使用“工具箱”一词的情况下,才有解决办法

正则表达式的解 当正则表达式被允许作为解决方案的一部分时,它就相当简单了。对于上述示例,正则表达式应为:

^(toolbox|stool|boxer)*$
如果一个句子与这个表达式匹配,它就是一个解决方案。如果不是,那就不是。这非常简单,实际上不需要算法。所有这些都是由正则表达式解释器完成的。以下是一个片段:

var words=['this','is','a','string']; var语句=['thisis'、'ThisisString'、'thisisaduck'、'thisisastringg'、'stringg']; var regex=new RegExp'^'+单词。连接'|'+'*$'; 句子。foreach句子=>{ //搜索返回一个位置。该位置应为0: console.log语句+':'+语句.searchregex?'No':'Yes';
};我会从最长的目标词到最短的。。。我的意思是“a”出现在很多词中,困难的情况是当你有输入时,比如:每2位3位每一位。你的解决方案需要意识到,即使一个单词以bite开头,它也可能以bit开头,下一个单词可能需要e。我该怎么开始?通过分类?我应该对前四个词进行分类还是什么?这是什么意思?为什么他因为试图帮助表达自己的观点而被否决?jfi:不是我:-S@choz我不知道,但我认为他的解决方案很好,所以我投了更高的票。我真的很喜欢他的拆分策略。我有点困惑,为什么我们要先把大词排序,还是先把小词排序?很好的第一个解决方案,非常独特。您能告诉我在哪里可以学习如何将变量设置为括号中的某个值,如var testString=words,str,I=0,很抱歉,我以前没有见过类似的内容,将变量设置为括号中的某个值。谢谢你像往常一样回答我的问题:语法var testString=words,str,i=0只是arrow函数的第一部分。括号中的部分列出了函数的参数,如下面的替代语法:var testString=function words,str,i=0{…等等。我在一个不使用箭头函数的版本中再次添加了最后一个代码块。比较语法可能会很有趣。第二个代码块在return I之后也有一个箭头。顺便说一句。谢谢,我将写下它并跟踪程序哈哈,我一直在玩控制台,试图在一块p上写下迭代我想我已经知道这是怎么回事了,我只是想稍后与你确认一些关于聊天代码的事情,不过我现在必须睡觉了。稍后再与你交谈: