2016-04-07 2 views
0

Как можно удалить одинаковое количество дубликатов для каждого символа в строке, пока не останется только один экземпляр одного из символов, останавливающих процесс удаления дубликатов от остальных персонажей?Удалить одинаковое количество повторяющихся символов для каждого символа в строке

Если у меня есть строка:

string = "aaaabbbxxxxx44444oooooo9999999" 

Вы можете видеть, что характер b есть символ с наименьшим количеством дублей (т.е. есть b следуют еще два b с), так что, если мы уберем 2 дубликаты из каждого набора символов, мы бы оставили со следующим без потери каких-либо символов, используемых в исходной строке, но свести к минимуму количества дублей для каждого персонажа:

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

Вы должны поместить это в метод.

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 

Чтобы запустить это в 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 " " 
=> " " 

Вы хотите проверить с различными входами (например, пустая строка), чтобы убедиться, что он работает.

Смежные вопросы