You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"]]

修正后的逻辑说明

修改后,递归就能正确处理后缀字符串了:

  1. 当匹配"purp"时,后缀是"le",递归调用会找到["le"],拼接成["purp", "le"];
  2. 当匹配"p"时,后缀是"urple",后续递归会依次匹配"ur"、"p"、"le",最终生成["p", "ur", "p", "le"];
  3. 所有有效组合都会被收集到result数组中,最终返回符合预期的结果。

内容的提问来源于stack exchange,提问作者Adif_Sgaid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 12:47:49