2016-04-07 11 views
0

重複を削除するプロセスを停止する文字の1つのインスタンスが1つだけ残るまで、文字列内の各文字に対して同じ数の重複を削除する方法残りの文字から?文字列内の文字ごとに同じ数の重複文字を削除する

私は、文字列がある場合:

string = "aaaabbbxxxxx44444oooooo9999999" 

をあなたは私たちは2を削除する場合、文字bは、重複の最小数(すなわち2つの以上b Sに続くbがあります)を持つ文字であるので、ことがわかります各文字セットの重複、我々は元の文字列で使用される任意の文字を失うことなく、各文字の重複の数を最小限にすることなく、次のように残されるだろう:

string = "aabxxx444oooo99999" 

はまた、私たちとさせて頂きます文字列には空白が含まれていないし、それが乱雑である場合:

string_b = "aabb4keekkk447abae777err99r9" 

あなたはまず、それを並べ替えることができます。

をあなたの軽減重複方法適用する前に:

string_b = "4779aabeekkr" 

答えて

2

をあなたがない場合元の順序や文字が必要な場合は、次の操作を実行できます。

string_b = "aabb4keekkk447abae777err99r9" 
h = string_b.chars.group_by { |c| c }.map { |c, a| [c, a.size] }.to_h 
#=> {"a"=>4, "b"=>3, "4"=>3, "k"=>4, "e"=>4, "7"=>4, "r"=>3, "9"=>3} 
# #to_h is optional here 

n = h.values.min - 1 
#=> 3 
# use map(&:last) instead of #values if not using #to_h previously 

h.map { |k, v| k * (v - n) }.sort.join 
#=> "4779aabeekkr" 
+1

また、最後のコード行から '.sort'を削除して、関心のある人のために文字の順序を保持することができます。 'h.map {| k、v | k *(v - n)} .join#=> "aab4kkee77r9" ' –

1

これはメソッドに入れる必要があります。あなたはそれが動作することを確認するために、さまざまな入力(例:空の文字列)でテストしたいIRBコンソールに

2.2.1 :230 > convert 'aaaabbbxxxxx44444oooooo9999999' 
=> "aabxxx444oooo99999" 
2.2.1 :231 > convert '' 
=> "" 
2.2.1 :232 > convert 'abc' 
=> "abc" 
2.2.1 :233 > convert 'abcabcddd' 
=> "abcdd" 
2.2.1 :234 > convert " " 
=> " " 

これを実行するには

def convert str 
    return str if str.empty? 
    letter_array = str.chars.group_by {|x| x}.values 
    drop_size = letter_array.map(&:size).min - 1 
    letter_array.map {|x| x.drop drop_size}.join 
end