循环滚动字符串的几种方法

来源:互联网 发布:第二批网络禁书目录 编辑:程序博客网 时间:2024/05/21 10:42

题目

例有字符串“abcdefg”,令其向右循环滚动3个字符,则会得到“efgabcd”
现给定字符串和滚动字符数,设计一个算法

 

方法一:转变为子问题

例如刚才的题目,我们用(a,b)表示a个字符中滚动b次
abcdefg  可以用(7,3)表示,令左边3个字符和右边3个字符交换位置,得到
efg(dabc) 其中前3个字符位置已经正确,题目变为(4,3),同理得到
efg(cab)d 题目变为(3,2),同理得到
efg(ba)cd 题目变为(2,1),同理得到
efgabcd,即所求

 

实现代码

 

 

方法二:常见方法,不解释
具体可参见_JULY_大神的文章
http://blog.csdn.net/v_JULY_v/archive/2011/04/14/6322882.aspx
上的思路1

 

实现代码

 

 

方法三:交换法

 

此方法是不停用第一个元素和第i个元素进行交换,一共交换len次,就得所求
其中i为 0, n % len, 2n % len, 3n % len ... (n-1)*len % len

abcdefg a<->a
dbcaefg a<->d
gbcaefd d<->g
cbgaefd g<->c
fbgaecd c<->f
bfgaecd f<->b
efgabcd b<->e

 

有一个问题是,如果 n与len非互素,则它们的最大公约数为一组的个数,把整个串分为len/gcd(len,n)组,执行上面的算法

实现代码