对于一个长度为n的字符串,将其左移或右移k位,在此以右移为例。
1.将字符串分成2段,1段是从左计算的长度n-k的段 另一段是剩下的长度为k的串
2.先将第一段与第二段的最后长度为n-k的部分交换;
3.再将原第二段的最后长度n-k的段变换为对称串(即刚交换到前方的部分);
4.再将第二段没动过的部分做对称变换;
5.最后将3 4步骤中的串视为一个串做对称变换 完成。
若k比n大,只需右移k mod n即可。
左移和右移思路一样,不再赘述。
对长度为n的串做对称变换需要时间是n/2 对2个长度为n的串交换需要时间为n,
移动一共需要时间为 (n-k)+(n-k)/2+(k-(n-k))/2+k/2=n
所以时间复杂性为o(n), 交换至多用常数空间,变换不需额外空间。所以空间复杂性为o(1)。
++