题目大意:
给定一个字符串str和整数i,i代表str中的位置,将str[0,...i]移到str的右侧,str[i+1,...length-1]移动到str的左侧。
如“ABCDE”,i =2,变化结果为“DEABC”
要求:时间复杂度为O(N),空间复杂度为O(1)
之前一篇博客提到如何判断字符串str2是字符串str1的旋转字符串。本题也可以采用将str拼接之后,按照i取子串的方法,这样需要额外空间复杂度为O(N),不满足题目的要求。
空间复杂度为O(1),需要在字符串原地进行调整。
思路:
1、给定字符串str,对str[0,...i-1]逆序处理,str[i+1,length-1]逆序处理
2、在1的基础上对整个字符串做逆序处理。
详见下图:
大多数字符串交换可以通过字符串局部逆序来组合实现。
代码实现(c++)版本:
class Translation {
public:
void reverseInternal(string &A,int i,int j){
while(i<j){
char temp = A[i];
A[i] = A[j];
A[j] = temp;
i++;
j--;
}
}
string stringTranslation(string A, int n, int len) {
// write code here
reverseInternal(A,0,len-1);
reverseInternal(A,len,n-1);
reverseInternal(A,0,n-1);
return A;
}
};