我正在尝试实现一个将参数作为参数的方法:目标 string 和其中包含 string 值的 array .目的是检查是否可以使用数组的值(给定的目标字符串)进行构造.array中的单词可以根据需要使用多次.示例:
I'm trying to implement a method that takes as a parameter: target string and an array with string values in it. The goal is to check if it is possible to construct with array's value, the given target string.The words in array can be used as many times as we want. Example:
console.log(canConstruct("abcdef", ["ab", "abc", "cd", "def", "abcd"])); // suppose to return true我们可以看到,通过将"abc" 和"def" 串联在一起,我们得到了"abcdef" 的目标字符串这是我的函数实现:
As we can see, by concatenating "abc" and "def" we get the target string of "abcdef" Here is my function implementation:
const canConstruct = function (target, wordBank) { if (target === "") return true; console.log(target); for (let word of wordBank) { if (target.startsWith(word)) { return canConstruct(target.replace(word, ""), wordBank); } } return false; };第2行是此递归函数的基本情况,然后通过遍历数组检查它是否以数组元素开头,如果为true,则删除该特定子数组,并使用新的目标字符串和旧数组再次调用该函数,如果为false,则继续遍历整个函数,直到遇到基本情况为止.因此,再次使用前面的示例:
Line 2 is a base case for this recursion function, then by iterating through the array check if it starts with the array element, if true then remove that specific subarray and call again the function with the new target string and old array, if false keep iterating through entire function till it hits the base case. So again using the previous example:
console.log(canConstruct("abcdef", ["ab", "abc", "cd", "def", "abcd"])); // return false我变得虚假了,通过调试,我发现自第一次递归调用以来,它没有迭代整个数组.我得到以下输出:
I'm getting false, and by debugging I can see that it didn't iterate the whole array from since first recursive call. I get the following output:
abcdef cdef ef false 推荐答案即使您返回false 并以这种方式跳过所有其他组合,您也会为循环而烦恼.因此,根据您的情况,您只能找到一条路径
You are breaking for loop even if you return false and skiping all other combinations that way. So you are founding only one path, in your case
ab cdconst canConstruct = function (target, wordBank) { if (target === "") return true; for (let word of wordBank) { if (target.startsWith(word)) { if (canConstruct(target.replace(word, ""), wordBank))//break it only if true return true; } } return false; }; console.log("abcdef", canConstruct("abcdef", ["ab", "abc", "cd", "def", "abcd"])); console.log("abc1def", canConstruct("abc1def", ["ab", "abc", "cd", "def", "abcd"]));
更多推荐
如何在for循环中正确调用递归函数?
发布评论