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

查找字符串是否是Ruby中的重复子字符串,ruby,string,Ruby,String,问题是: 如果某个字符串可以表示为某个字符串的k个串联副本,则该字符串称为k字符串。例如,字符串“aabaab”同时是1字符串、2字符串和4字符串,但不是3字符串、5字符串或6字符串等。显然,任何字符串都是1字符串 给您一个字符串s,由小写英文字母和正整数k组成。您的任务是对字符串s中的字母重新排序,使生成的字符串为k字符串 输入 第一个输入行包含整数k(1 ≤ K ≤ 1000). 第二行包含s,s中的所有字符都是小写英文字母。字符串长度s满足不等式1 ≤ || ≤ 1000,其中| s |是

问题是: 如果某个字符串可以表示为某个字符串的k个串联副本,则该字符串称为k字符串。例如,字符串“aabaab”同时是1字符串、2字符串和4字符串,但不是3字符串、5字符串或6字符串等。显然,任何字符串都是1字符串

给您一个字符串s,由小写英文字母和正整数k组成。您的任务是对字符串s中的字母重新排序,使生成的字符串为k字符串

输入 第一个输入行包含整数k(1 ≤ K ≤ 1000). 第二行包含s,s中的所有字符都是小写英文字母。字符串长度s满足不等式1 ≤ || ≤ 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'
对我来说,这个解决方案似乎应该有效,但在测试用例中失败了。有人能告诉我为什么吗?

这是我的解决方案

只需创建一个段,然后将其输出
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

什么样的测试用例会失败,它是如何失败的?如果你也给我们看测试用例,那会很有帮助。这看起来非常残忍。如果我理解k字符串的定义,每个字符必须出现k次的倍数。因此,我可能会对字符进行排序,计算它们的出现次数,并查看每个字符是否满足该标准。如果不是,则打印-1。否则,找到代表一个“单位”的字符子集,以随机方式对它们排序,然后重复k次。@Floris我不明白。如果一个k字串意味着你所说的,那么对于k=2 aaaazzaaabb就不是一个k字串。但实际上是这样,因为它可以变成字符串aaaazbaaaazb@Floris没关系,我知道你说的是k的倍数。这意味着{character count}%k必须=0