题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串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()函数请看“求字符串长度”
原文:http://blog.csdn.net/mmoojing/article/details/19156861