0

'abcde'などの文字列があり、1文字または2文字のすべての組み合わせの2D配列を取得したい場合。

[ ['a', 'b', 'c', 'd', 'e'], ['ab', 'c', 'de'], ['a', 'bc', 'd', 'e'] ...

どうすればそうすることができますか?

これをルビーでやりたいので、正規表現を使うべきだと思います。使ってみました

strn = 'abcde'
strn.scan(/[a-z][a-z]/)

しかし、これは私に2文字の明確なセットを与えるだけです

['ab', 'cd']
4

4 に答える 4

1

私はこれがそれを行うべきだと思います(まだテストされていません):

def find_letter_combinations(str)
  return [[]] if str.empty?
  combinations = []
  find_letter_combinations(str[1..-1]).each do |c|
    combinations << c.unshift(str[0])
  end
  return combinations if str.length == 1
  find_letter_combinations(str[2..-1]).each do |c|
    combinations << c.unshift(str[0..1])
  end
  combinations
end
于 2012-10-17T19:12:34.780 に答える
1

正規表現は、この種の問題には役立ちません。Ruby1.9の便利なArray#combination(n)関数を使用することをお勧めします。

def each_letter_and_pair(s)
  letters = s.split('')
  letters.combination(1).to_a + letters.combination(2).to_a
end

ss = each_letter_and_pair('abcde')
ss # => [["a"], ["b"], ["c"], ["d"], ["e"], ["a", "b"], ["a", "c"], ["a", "d"], ["a", "e"], ["b", "c"], ["b", "d"], ["b", "e"], ["c", "d"], ["c", "e"], ["d", "e"]]
于 2012-10-17T19:19:16.950 に答える
0

いいえ、正規表現はここでは適していません。確かに、次のように1つまたは2つの文字を一致させることができます。

strn.scan(/[a-z][a-z]?/)
# matches: ['ab', 'cd', 'e']

ただし、正規表現を使用してすべての組み合わせの(2d)リストを生成することはできません。

于 2012-10-17T19:08:19.753 に答える
0

機能的な再帰的アプローチ:

def get_combinations(xs, lengths)
  return [[]] if xs.empty?
  lengths.take(xs.size).flat_map do |n|
    get_combinations(xs.drop(n), lengths).map { |ys| [xs.take(n).join] + ys } 
  end
end

get_combinations("abcde".chars.to_a, [1, 2])
#=> [["a", "b", "c", "d", "e"], ["a", "b", "c", "de"], 
#    ["a", "b", "cd", "e"], ["a", "bc", "d", "e"], 
#    ["a", "bc", "de"], ["ab", "c", "d", "e"], 
#    ["ab", "c", "de"], ["ab", "cd", "e"]]
于 2012-10-17T20:16:45.897 に答える