题目
原始字符串为”abcdef”,请设计算法转换为”defabc”。
思路一
初始的想法可以是可以通过暴力转换的方式去实现。通过观察原始字符串和目标字符串的区别可以发现,转换的过程可以看作是字符串的循环移动过程;将原始字符串往前移动3个位置就可以实现目标。有了思路就可以实现具体的代码了:
char origin[]="abcdef";
for(int i=0;i<3;i++){
char tempchar(origin1[0]);
for(int i=0;i<6;i++){
origin1[i]=origin[i+1];
}
origin[5]=tempchar;
}
cout<<"origin1:"<<origin1<<endl;// space o(1) time o(m*n)
本思路的空间复杂度为O(1),时间复杂度O(n)。
思路二
再仔细观察原始和目标字符串之间的区别,可以发现它们之间的区别其实就是第一位开始依次与后3位的字符互换。因此可以编写如下的代码:
char origin[]="abcdef";
for(int i=0;i<3;i++){
char tt;
tt=origin2[i];
origin2[i]=origin2[i+3];
origin2[i+3]=tt;
}
cout<<"origin2:"<<origin2<<endl;// space o(1) time o(n)
本思路的空间复杂度为O(1),时间复杂度为O(n).
思路三
对于原始字符串可以理解为以中间字符为中心翻转之后达到目标字符串。
- 第一步:abc进行旋转,旋转之后成为cba;
- 第二步:def进行旋转,旋转之后成为fed;
- 第三步:将部分翻转之后的字符串cbafed进行反转,翻转之后为:defabc达到目标。
实现代码如下:
char origin[]="abcdef";
int from=0;
int to=2;
while(from<to){
char temp=origin3[from];
origin[from]=origin3[to];
origin[to]=temp;
from++;
to--;
}
from=3;
to=5;
while(from<to){
char temp=origin[from];
origin[from]=origin3[to];
origin[to]=temp;
from++;
to--;
}
from=0;
to=5;
while(from<to){
char temp=origin[from];
origin[from]=origin3[to];
origin[to]=temp;
from++;
to--;
}
cout<<"origin3:"<<origin3<<endl;// space o(1) time o(n)
}
本思路的时间复杂度为O(n),空间复杂度为O(1)。
最后附上详细的代码:
#include <iostream>
int main(){
//思路1
char origin1[]="abcdef";
char des[]="defabc";
for(int i=0;i<3;i++){
char tempchar(origin1[0]);
for(int i=0;i<6;i++){
origin1[i]=origin1[i+1];
}
origin1[5]=tempchar;
}
cout<<"origin1:"<<origin1<<endl;// space o(1) time o(m*n)
//思路2
char origin2[]="abcdef";
for(int i=0;i<3;i++){
char tt;
tt=origin2[i];
origin2[i]=origin2[i+3];
origin2[i+3]=tt;
}
cout<<"origin2:"<<origin2<<endl;// space o(1) time o(n)
//思路3
char origin3[]="abcdef";
int from=0;
int to=2;
while(from<to){
char temp=origin3[from];
origin3[from]=origin3[to];
origin3[to]=temp;
from++;
to--;
}
from=3;
to=5;
while(from<to){
char temp=origin3[from];
origin3[from]=origin3[to];
origin3[to]=temp;
from++;
to--;
}
from=0;
to=5;
while(from<to){
char temp=origin3[from];
origin3[from]=origin3[to];
origin3[to]=temp;
from++;
to--;
}
cout<<"origin3:"<<origin3<<endl;// space o(1) time o(n)
}
输出为:
origin1:defabc
origin2:defabc
origin3:defabc