实现字符串的循环移动:
循环移动某一给出的字符串,然后把前面k个字符拿到后面去,例如:abcdefg。我把前面3个字符拿到后面去变成:defgabc。实现这一算法的思路借助于线性代数的转置,(AB)^T = B^TA^T。因此把abcdefg拆成abc和defg两个字串,先把abc转置cba,然后吧defg转置gfed,拼接起来cbagfed,在转置得defgabc,即为所求,代码为:
#include<stdio.h>
#include<string.h>
void reverseing(char*s, int from, int to){
while(from < to){
char t = s[from];
s[from++] = s[to];
s[to--] = t;
}
}
void leftRotateString(char *s, int n, int m){
m %= n;
reverseing(s, 0, m-1);
reverseing(s, m, n-1);
reverseing(s, 0, n-1);
}
int main(){
char s[7] = "abcdefg";
leftRotateString(s, 7, 3);
// std::cout<<"re-s="<<s<<std::endl;
printf("%s\n", s);
return 0;
}