题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
思路:
因为要求辅助内存只是1,所以可以通过反转字符串完成。
字符串分为两部分,用AB表示,A代表需要左旋转的部分,B代表剩下的部分。
首先分别把A、B反转,然后再把字符串整体反转。
代码:
char *ReverseString(char *string, int start, int end)
{
if(string == NULL)
{
return string;
}
char ch;
//标记要反转的左边位置
int i = start;
//标记要反转的右边位置
int j = end;
while(i < j)
{
ch = string[i];
string[i] = string[j];
string[j] = ch;
i++;
j--;
}
return string;
}
char *LeftRotationStr(char *intputStr, int rotationLen)
{
//计算字符串长度
int strLen = StringLength(intputStr);
if(intputStr == NULL || rotationLen == 0 || rotationLen >= strLen)
{
return intputStr;
}
//将需左旋的字符串反转
intputStr = ReverseString(intputStr, 0, rotationLen-1);
//将剩下的字符串反转
intputStr = ReverseString(intputStr, rotationLen, strLen-1);
//将字符串整体反转
intputStr = ReverseString(intputStr, 0, strLen-1);
return intputStr;
}
注:代码中所用到的求字符串长度的StringLength()函数请看“求字符串长度”