算法 旋转字符串
① 旋转K位就是K次向左或右移动,移动的方法是一位一位地复制...(最最普通的方法)
② 利用ba=(br)^T(ar)^T=(arbr)^T,通过三次反转字符串。(首先对序列前部分逆序,再对序列后部分逆序,再对整个序列全部逆序)
③ 分组交换(尽可能使数组的前面连续几个数为所要结果):
若a长度大于b,将ab分成a0a1b,交换a0和b,得ba1a0,只需再交换a1 和a0。
若a长度小于b,将ab分成ab0b1,交换a和b0,得b0ab1,只需再交换a 和b0。
通过不断将数组划分,和交换,直到不能再划分为止。分组过程与求最大公约数很相似。
④ 所有序号为 (j+i *m) % n ( j 表示每个循环链起始位置,i 为计数变量,m表示左旋转位数,n表示字符串长度 ),会构成一个循环链(共有gcd(n,m)个,gcd为n、m的最大公约数),每个循环链上的元素只要移动一个位置即可,最后整个过程总共交换了n次(每一次循环链,是交换n/gcd(n,m)次,总共gcd(n,m)个循环链。所以,总共交换n次)。
http://blog.youkuaiyun.com/v_JULY_v/article/details/6322882
① 旋转K位就是K次向左或右移动,移动的方法是一位一位地复制...(最最普通的方法)
② 利用ba=(br)^T(ar)^T=(arbr)^T,通过三次反转字符串。(首先对序列前部分逆序,再对序列后部分逆序,再对整个序列全部逆序)
③ 分组交换(尽可能使数组的前面连续几个数为所要结果):
若a长度大于b,将ab分成a0a1b,交换a0和b,得ba1a0,只需再交换a1 和a0。
若a长度小于b,将ab分成ab0b1,交换a和b0,得b0ab1,只需再交换a 和b0。
通过不断将数组划分,和交换,直到不能再划分为止。分组过程与求最大公约数很相似。
④ 所有序号为 (j+i *m) % n ( j 表示每个循环链起始位置,i 为计数变量,m表示左旋转位数,n表示字符串长度 ),会构成一个循环链(共有gcd(n,m)个,gcd为n、m的最大公约数),每个循环链上的元素只要移动一个位置即可,最后整个过程总共交换了n次(每一次循环链,是交换n/gcd(n,m)次,总共gcd(n,m)个循环链。所以,总共交换n次)。
http://blog.youkuaiyun.com/v_JULY_v/article/details/6322882