Ruby中all_construct算法实现异常排查:无法生成目标字符串的所有组合方案
问题排查与修正
我帮你揪出代码里的问题啦!你的all_construct算法返回空数组的原因,是后缀字符串的截取逻辑出错了,导致递归无法正确匹配后续的单词。
问题根源
问题出在这一行:
suffix = target.slice(word.length)
在Ruby中,String#slice只传一个整数参数时,它会返回对应索引位置的单个字符,而不是从该索引开始到末尾的子串。举个例子:
- 当处理目标字符串
"purple"和单词"purp"时,word.length是4,target.slice(4)会返回字符"e",而不是你需要的后缀"le"。 - 后续递归处理
"e"时,wordBank里没有能匹配的单词,递归返回空数组,最终整个结果自然就为空了。
修正方案
把后缀截取的代码改成以下两种写法之一,它们都会返回从指定索引开始到字符串末尾的子串:
suffix = target.slice(word.length..)suffix = target[word.length..]
修正后的完整代码
def all_construct(target, wordBank) return [[]] if target == '' result = [] wordBank.each do |word| if target.index(word) == 0 suffix = target.slice(word.length..) # 修正此处 suffixResult = all_construct(suffix, wordBank) suffixWay = suffixResult.map { |e| [ word, *e] } result.push(*suffixWay) end end return result end # 测试验证 p all_construct("purple",["purp","p","ur","le","purpl"]) # 输出:[["purp", "le"], ["p", "ur", "p", "le"]]
修正后的逻辑说明
修改后,递归就能正确处理后缀字符串了:
- 当匹配
"purp"时,后缀是"le",递归调用会找到["le"],拼接成["purp", "le"]; - 当匹配
"p"时,后缀是"urple",后续递归会依次匹配"ur"、"p"、"le",最终生成["p", "ur", "p", "le"]; - 所有有效组合都会被收集到
result数组中,最终返回符合预期的结果。
内容的提问来源于stack exchange,提问作者Adif_Sgaid
相关产品推荐
相关产品推荐

