我正在嘗試獲取一個字串,并在不改變順序的情況下回傳所有可能的排列。例如:
string_array = ["abc"]
empty_array = []
string_array.each do |element|
for i in (0..(element.length-1)) do
empty_array.push(element[0..i])
i = 1
end
end
像這樣的東西會給['a', 'ab', 'abc']。
但是,我需要['a', 'ab', 'abc', 'b', 'bc', 'c'].
無論如何修改我的代碼以包含這個?
uj5u.com熱心網友回復:
您可以使用repeated_combination生成每個子字串的第一個和最后一個索引:
[0, 1, 2].repeated_combination(2).to_a
#=> [[0, 0], [0, 1], [0, 2], [1, 1], [1, 2], [2, 2]]
要實際提取子字串:
str = 'abc'
(0...str.size).to_a.repeated_combination(2).map { |i, j| str[i..j] }
#=> ["a", "ab", "abc", "b", "bc", "c"]
uj5u.com熱心網友回復:
我將建議將字串拆分為一個字符陣列,然后#each_cons用于獲取這些字符組。如果我們flat_map超過可能的不同長度(1 .. str.size),我們可以產生所有的可能性。
1.upto(str.size).flat_map { |i| str.split('').each_cons(i).map(&:join) }
輸出:
["a", "b", "c", "ab", "bc", "abc"]
或者讓這可能更有效一點:
chars = str.split('')
1.upto(str.size).flat_map { |i| chars.each_cons(i).map(&:join) }
uj5u.com熱心網友回復:
讓我們首先創建一個輔助方法:
def one_pass(str)
(1..str.size).map { |n| str[0,n] }
end
one_pass("abc")
#=> ["a", "ab", "abc"]
one_pass("bc")
#=> ["b", "bc"]
one_pass("c")
#=> ["c"]
main 方法現在很簡單:
def doit(str)
str.size.times.flat_map { |i| one_pass(str[i..]) }
end
doit("abc")
#=> ["a", "ab", "abc", "b", "bc", "c"]
doit("abcd")
#=> ["a", "ab", "abc", "abcd", "b", "bc", "bcd", "c", "cd", "d"]
請參閱String#[]和Enumerable#flat_map。
如果你堅持將這兩種方法結合起來:
def doit(str)
str.size.times.flat_map do |i|
s = str[i..-1]
(1..s.size).map { |n| s[0,n] }
end
end
uj5u.com熱心網友回復:
string_array.each do |element|
for z in (0..element.length-1) do
for i in (0..(element.length-1)) do
empty_array.push(element[z..i])
i = 1
end
end
end
我通過將 for 回圈嵌套在另一個 for 回圈中解決了這個問題,但是如果其他人有更有效的解決方案,我將不勝感激
uj5u.com熱心網友回復:
以下代碼的想法是重復['a', 'ab', 'abc']從'abc'for 'bc' 到 'c' 的程序:
string_array = ["abc"]
empty_array = []
string_array.each do |element|
for i in (0..(element.length-1)) do
for j in (i..(element.length-1)) do
empty_array.push(element[i..j])
end
end
end
uj5u.com熱心網友回復:
也許我們可以使用 ruby ?? https://www.rubydoc.info/stdlib/core/Array:permutation中的排列方法
def custom_permutation
string = 'abc'
string_array = string.chars
result = []
1.upto(string_array.size) do |i|
result << string_array.permutation(i).map(&:join)
end
# We could change the default sort or remove it
result.flatten.sort
end
這將回傳如下內容:
["a", "ab", "abc", "ac", "acb", "b", "ba", "bac", "bc", "bca", "c", "ca", "cab", "cb", "cba"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/485803.html
