代码之家  ›  专栏  ›  技术社区  ›  bragboy

如何在Ruby中找到字符串的所有周期?

  •  6
  • bragboy  · 技术社区  · 14 年前

    我在Ruby中编写了一个方法来查找文本的所有循环组合

    x = "ABCDE"
    (x.length).times do
      puts x
      x = x[1..x.length] + x[0].chr
    end
    

    有没有更好的方法来实现这一点?

    4 回复  |  直到 14 年前
        1
  •  11
  •   wuputah    14 年前

    这里有另一种方法。

    str = "ABCDE"
    (0...str.length).collect { |i| (str * 2)[i, str.length] }
    

    我用了一个靶场 #collect 假设你想对字符串做些别的事情(而不仅仅是打印它们)。

        2
  •  4
  •   Alex Wayne    14 年前

    x = "ABCDE"
    x.length.downto(0) do |i|
      puts x[i..-1] + x[0...i]
    end
    

    它将字符串从当前索引连接到结尾,并将开始部分连接到当前索引。

        3
  •  3
  •   AboutRuby    14 年前

    你可以写一个枚举器。

    #!/usr/bin/env ruby
    
    class String
      def rotations
        Enumerator.new do|y|
          times = 0
          chars = split('')
    
          begin
            y.yield chars.join('')
    
            chars.push chars.shift
            times += 1
          end while times < chars.length
        end
      end
    end
    

    这样你就可以做这样的事情。

    "test".rotations.each {|r| puts r}
    
        4
  •  2
  •   Anurag    14 年前

    将字符串合并到自身,并使用 Enumerable.each_cons

    s = "hello"
    (s + s).split('').each_cons(s.size).map(&:join)[0..-2]
    
    # ["hello", "elloh", "llohe", "lohel", "ohell"]