利用STL中的思路//试用于random access iterator
int gcd(int m,int n){
return n?gcd(n,m%n):m;
}
void rotate(char* str,int step){
size_t len=strlen(str);
int n=gcd(len,step);
char* end=str+len;
while(n--){
char* init=str+n;
char val=*init;
char* p=init;
char* q=p+step;
while(q!=init){
*p=*q;
p=q;
if(end-q>step){
q=q+step;
}else{
q=str+(step-(end-q));
}
}
*p=val;
}
}
int main(){
char str[]="abcdefgh";
rotate(str,2);
cout<<str<<endl;
system("pause");
return 0;
}
第二种思路://适用于bidirectional iterator
void rotate2(char* str,int step){
reverse(str,str+step);
reverse(str+step,str+strlen(str));
reverse(str,str+strlen(str));
}
曾经一个题:
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。
其实这个只用第二种思路就好。
对于 I am a student转换为student a am I要怎么实现时间复杂度为O(n),空间复杂度为O(1)
先逆转,然后在每个单词逆转,这个时间复杂度就满足,当时这个问题想多了。