文字列内の連続する文字の最大出現回数を調べ、結果を並べ替えた配列として返すにはどうすればよいですか。
例:
input = “abcccdddeee”
output = [“c”,”d”,”e”]
文字列内の連続する文字の最大出現回数を調べ、結果を並べ替えた配列として返すにはどうすればよいですか。
例:
input = “abcccdddeee”
output = [“c”,”d”,”e”]
これは大雑把であり、改善できる可能性がありますが、基本的には、現在の状態が前の文字であり、次の状態がリセットまたはカウンターのインクリメントである単純な状態マシンを見ています。
str = "abcccdddeee"
state = nil
current_count = 0
counts = {}
str.each_char do |char|
if state == char
current_count += 1
counts[char] ||= 0
counts[char] = current_count if current_count > counts[char]
else
current_count = 0
end
state = char
end
p counts.to_a.sort {|a, b| b[1] <=> a[1] }.map(&:first)
これは、現在の入力によって FSM がカウント状態のままになっている場合にのみカウントして格納するため、出力で非反復文字を取得することはありません。
ただし、これは Ruby であるため、ごまかして正規表現を使用できます。
"abccdddeee".scan(/((.)\2{1,})/).map(&:first).sort_by(&:length).map {|s| s[0] }