问题在于: 如果字符串可以表示为某些字符串的k个连续副本,则该字符串称为k字符串。例如,字符串“aabaabaabaab”同时是1字符串,2字符串和4字符串,但它不是3字符串,5字符串或6字符串,依此类推。显然任何字符串都是1字符串。
您将获得一个字符串s,由小写英文字母和正整数k组成。你的任务是重新排序字符串s中的字母,使得结果字符串是一个k字符串。
输入 第一个输入行包含整数k(1≤k≤1000)。第二行包含s,s中的所有字符都是小写英文字母。字符串长度s满足不等式1≤| s | ≤1000,其中| s |是字符串s的长度。
输出 重新排列字符串s中的字母,使结果为k字符串。在单个输出行上打印结果。如果有多种解决方案,请打印其中任何一种。
如果解决方案不存在,请打印“-1”(不带引号)。
这是我的代码:
k = gets.to_i
str = gets.chomp.split(//)
n = str.length/k
map = Hash.new(0)
map2 = Hash.new(0)
str.each { |i| map[i] += 1 }
x = str.uniq.permutation(n).map(&:join).each do |string|
string.each_char { |c| map2[c] += k }
if map2 == map
puts string*k
exit
end
map2 = Hash.new(0)
end
puts '-1'
对我来说,这个解决方案似乎应该可行,但它在测试用例上失败了。谁能告诉我为什么?
答案 0 :(得分:1)
这是我的解决方案。
只需创建一个细分,然后输出k
次。如果一个字符没有出现k次(或它的倍数),则提前停止并输出-1。
k = gets.to_i
str = gets.chomp.split(//)
counts = Hash.new(0)
str.each { |i| counts[i] += 1 }
out = ''
str.uniq.each do |c|
if counts[c] % k != 0
puts -1
exit
end
out = out + c*(counts[c]/k)
end
puts out*k