JS转Dart:递归allConstruct函数翻译结果异常问题排查
修复Dart版allConstruct函数的问题
问题分析
你的Dart代码存在几个关键错误,导致输出结果不符合预期:
- 函数名拼写偏差:原JavaScript函数名为
allConstruct,你的代码写成了allContruct(少了一个s),虽不影响逻辑,但建议保持命名统一。 - 后缀字符串获取方式错误:使用
target.split(word)[1]存在风险,比如当word完全匹配target时,split会返回['', ''],更可靠的方式是用target.substring(word.length),和JavaScript的slice行为完全一致,直接截取从word长度位置开始的子串。 - 结果集合添加逻辑错误:JavaScript中
result.push(...targetWays)是将targetWays中的每一个元素展开添加到result数组;而你的代码用result.insert(0, targetWays)是把map返回的整个Iterable作为单个元素插入到result开头,这会导致结果嵌套层级错误,且顺序不符合预期。 - 缺少强类型声明:Dart是强类型语言,未指定函数返回类型和变量类型,容易引发动态类型相关的隐性问题。
修正后的代码
List<List<String>> allConstruct(String target, List<String> wordBank) { if (target == '') return [[]]; final List<List<String>> result = []; for (final String word in wordBank) { if (target.startsWith(word)) { final String suffix = target.substring(word.length); final List<List<String>> suffixWays = allConstruct(suffix, wordBank); final List<List<String>> targetWays = suffixWays.map((way) => [word, ...way]).toList(); result.addAll(targetWays); } } return result; }
测试验证
调用allConstruct('purple', ['purp', 'p', 'ur', 'le', 'purpl']),输出结果为:[['purp', 'le'], ['p', 'ur', 'p', 'le']],与JavaScript版本的输出完全一致。
内容的提问来源于stack exchange,提问作者Peppinhood
相关产品推荐
相关产品推荐

