查找字符串是否是Ruby中的重复子字符串

时间:2013-03-28 03:28:59

标签: ruby string

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

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

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