0

问题是:如果一个字符串可以表示为某个字符串的 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'

对我来说,这个解决方案似乎应该可以工作,但它在测试用例上失败了。谁能告诉我为什么?

4

1 回答 1

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
于 2013-03-28T04:37:32.450 回答