题目大意:
给定一个字符串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 Rotation {
public:
int next[200];
void getnext(string B, int lenb){
int i = 0;int j = -1; next[0] = -1;
while(i<lenb){
if(j==-1 || B[i] == B[j]){
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int kmp(string A, int lena, string B, int lenb){
getnext(B,lenb);
int i = 0;int j = 0;
while(i<lena && j<lenb){
if( j ==-1 || A[i] == B[j]){
i++;
j++;
}
else
j = next[j];
}
if(j ==lenb)
return (i-j);
else
return -1;
}
bool chkRotation(string A, int lena, string B, int lenb) {
// write code here
if(lena !=lenb)
return false;
string A2 = A+A;
lena = 2*lena;
if(kmp(A2,lena,B,lenb)!=-1)
return true;
else
return false;
}
};
其中注意要先判断lena和lenb是否相等,这样能减少一部分运算复杂度。