Ruby 回文分区没有输出

Ruby 回文分区没有输出,ruby,palindrome,Ruby,Palindrome,嗨,我在用递归解决回文分区问题。这个问题是返回给定字符串输入的所有可能的回文分区 输入:“aab”输出:[“aa”,“b”],[“a”,“a”,“b”]] 回文分区定义:给定一个字符串S,分区是一组子字符串,每个子字符串包含一个或多个字符,因此每个子字符串都是回文 我的代码如下。我遇到的问题是,结果数组从未正确填充。从较高的层次上说,我觉得我的逻辑是有道理的,但当我试图调试它时,我并不确定到底发生了什么 def partition(string) result = [] output =

嗨,我在用递归解决回文分区问题。这个问题是返回给定字符串输入的所有可能的回文分区

输入:“aab”
输出:[“aa”,“b”],[“a”,“a”,“b”]]

回文分区定义:给定一个字符串S,分区是一组子字符串,每个子字符串包含一个或多个字符,因此每个子字符串都是回文

我的代码如下。我遇到的问题是,结果数组从未正确填充。从较高的层次上说,我觉得我的逻辑是有道理的,但当我试图调试它时,我并不确定到底发生了什么

def partition(string)
  result = []
  output = []
  dfs(string, 0, output, result)
  result
end

def dfs(string, start, output, result)
  if start == string.length
    result << output
    return
  end

  (start..string.length-1).to_a.each do |i|
    if is_palindrome(string, start, i)
      output << string[start..(i-start+1)]
      dfs(string, i+1, output, result)
      output.pop
    end
  end
end


def is_palindrome(string, start, end_value)
  result = true
  while start < end_value do
    result = false if string[start] != string[end_value]
    start += 1
    end_value -= 1
  end
  result
end

puts partition("aab")
def分区(字符串)
结果=[]
输出=[]
dfs(字符串、0、输出、结果)
结果
结束
def dfs(字符串、开始、输出、结果)
如果start==string.length

结果是的,您确实希望使用递归。我没有仔细分析您的代码,但我发现方法中有一个问题
dfs

if start == string.length
  result << output
  return
end

理解这种递归如何工作的最好方法是添加一些
put
语句并重新运行它

def pps(str)
  puts "\nstr=#{str}"
  return [[]] if str.empty?
  rv = (1..str.size).each_with_object([]) do |i,a|
    s = str[0,i]
    puts "i=#{i}, a=#{a}, s=#{s}, is_pal?(s)=#{is_pal?(s)}"
    next unless is_pal?(s)
    pps(str[i..-1]).each { |b| puts "b=#{b}, [s,*b]=#{[s,*b]}"; a << [s, *b] }
    puts "a after calling pps=#{a}"
  end
  puts "rv=#{rv}"
  rv
end

提示:
str==str.reverse
是一种更快的回文测试方法。还有,为什么要将某个内容放入数组,然后几乎立即对其调用
pop
?您还没有定义“回文分区”。我相信是这样的:给定一个字符串
s
,将其划分为子字符串,每个子字符串包含一个或多个字符,这样每个子字符串都是回文。例如,
“aab”
可以分为
[“a”,“ab”]
[“aa”,“b”]
[“a”,“b”,“c”]
。第二个和第三个的所有元素(子字符串)都是回文,但第一个中的
“ab”
不是回文。对的显然,
“abacdabefab”
可以用很多方式进行分区。@CarySwoveland补充说,作为一个编辑,感谢您应该更明确地提到它是什么,您不需要提及它是一个编辑。
pps "aab"
  #=> [["a", "a", "b"],
  #    ["aa", "b"]]
pps "aabbaa"
  #=> [["a", "a", "b", "b", "a", "a"],
  #    ["a", "a", "b", "b", "aa"],
  #    ["a", "a", "bb", "a", "a"],
  #    ["a", "a", "bb", "aa"],
  #    ["a", "abba", "a"],
  #    ["aa", "b", "b", "a", "a"],
  #    ["aa", "b", "b", "aa"],
  #    ["aa", "bb", "a", "a"],
  #    ["aa", "bb", "aa"],
  #    ["aabbaa"]] 
pps "aabbbxaa"
  #=> [["a", "a", "b", "b", "b", "x", "a", "a"],
  #    ["a", "a", "b", "b", "b", "x", "aa"],
  #    ["a", "a", "b", "bb", "x", "a", "a"],
  #    ["a", "a", "b", "bb", "x", "aa"],
  #    ["a", "a", "bb", "b", "x", "a", "a"],
  #    ["a", "a", "bb", "b", "x", "aa"],
  #    ["a", "a", "bbb", "x", "a", "a"],
  #    ["a", "a", "bbb", "x", "aa"],
  #    ["aa", "b", "b", "b", "x", "a", "a"],
  #    ["aa", "b", "b", "b", "x", "aa"],
  #    ["aa", "b", "bb", "x", "a", "a"],
  #    ["aa", "b", "bb", "x", "aa"],
  #    ["aa", "bb", "b", "x", "a", "a"],
  #    ["aa", "bb", "b", "x", "aa"],
  #    ["aa", "bbb", "x", "a", "a"],
  #    ["aa", "bbb", "x", "aa"]] 
pps "abcdefghijklmnopqrstuvwxyz"
  #=> [["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
  #     "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]] 
def pps(str)
  puts "\nstr=#{str}"
  return [[]] if str.empty?
  rv = (1..str.size).each_with_object([]) do |i,a|
    s = str[0,i]
    puts "i=#{i}, a=#{a}, s=#{s}, is_pal?(s)=#{is_pal?(s)}"
    next unless is_pal?(s)
    pps(str[i..-1]).each { |b| puts "b=#{b}, [s,*b]=#{[s,*b]}"; a << [s, *b] }
    puts "a after calling pps=#{a}"
  end
  puts "rv=#{rv}"
  rv
end
pps "aab"

str=aab
i=1, a=[], s=a, is_pal?(s)=true

str=ab
i=1, a=[], s=a, is_pal?(s)=true

str=b
i=1, a=[], s=b, is_pal?(s)=true

str=
b=[], [s,*b]=["b"]
a after calling pps=[["b"]]
rv=[["b"]]
b=["b"], [s,*b]=["a", "b"]
a after calling pps=[["a", "b"]]
i=2, a=[["a", "b"]], s=ab, is_pal?(s)=false
rv=[["a", "b"]]
b=["a", "b"], [s,*b]=["a", "a", "b"]
a after calling pps=[["a", "a", "b"]]
i=2, a=[["a", "a", "b"]], s=aa, is_pal?(s)=true

str=b
i=1, a=[], s=b, is_pal?(s)=true

str=
b=[], [s,*b]=["b"]
a after calling pps=[["b"]]
rv=[["b"]]
b=["b"], [s,*b]=["aa", "b"]
a after calling pps=[["a", "a", "b"], ["aa", "b"]]
i=3, a=[["a", "a", "b"], ["aa", "b"]], s=aab, is_pal?(s)=false
rv=[["a", "a", "b"], ["aa", "b"]]
  #=> [["a", "a", "b"], ["aa", "b"]]