字符串的左旋转操
来源:互联网 发布:苹果launchpad软件 编辑:程序博客网 时间:2024/05/20 05:10
题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef 左旋转2 位得到字符串cdefab。
请实现字符串左旋转的函数,要求时间对长度为n 的字符串操作的复杂度为O(n),辅助内存为O(1)。
思路一:
分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我们可以新开辟一块长度为n+1 的辅助空间,把原字符串后半部分拷贝到新空间的前半部分,再把原字符串的前半部分拷贝到新空间的后半部分。不难看出,这种思路的时间复杂度是O(n),需要的辅助空间也是O(n),显然和题目要求的不符合,因此我们要用另想其他的解法。
把字符串看成有两段组成的,记为XY。左旋转相当于要把字符串XY 变成YX。我们先在字符串上定义一种翻转的操作,就是翻转字符串中字符的先后顺序,把X 翻转后记为XT。显然有(XT)T=X。我们首先对X 和Y 两段分别进行翻转操作,这样就能得到XTYT。接着再对XTYT 进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX。正好是我们期待的结果。
分析到这里我们再回到原来的题目。我们要做的仅仅是把字符串分成两段,第一段为前面n个字符,其余的字符分到第二段。再定义一个翻转字符串的函数,按照前面的步骤翻转三次就行了。时间复杂度和空间复杂度都合乎要求。
代码如下:
- /*-----------------------------
- Copyright by yuucyf. 2011.08.15
- ------------------------------*/
- #include "stdafx.h"
- #include <assert.h>
- #include <iostream>
- using namespace std;
- void ReverseString(char* pStart, char* pEnd)
- {
- assert(pStart);
- assert(pEnd);
- char cTemp;
- while (pStart <= pEnd)
- {
- cTemp = *pStart;
- *pStart = *pEnd;
- *pEnd = cTemp;
- pStart++;
- pEnd--;
- }
- }
- char *LeftRotateString(char *pStr, int n)
- {
- if (NULL != pStr)
- {
- int i32Len = static_cast<int>(strlen(pStr));
- if (i32Len > 0 && i32Len > n)
- {
- char *pFirStart = pStr;
- char *pFirEnd = pStr + n - 1;
- char *pSecStart = pStr + n;
- char *pSecEnd = pStr + i32Len - 1;
- ReverseString(pFirStart, pFirEnd);
- ReverseString(pSecStart, pSecEnd);
- ReverseString(pFirStart, pSecEnd);
- }
- }
- return pStr;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- char aszSrcStr[] = {"abcdef"};
- cout << "输入的字符串为:"<< aszSrcStr << " 输出的字符串为:";
- LeftRotateString(aszSrcStr, 2);
- cout << aszSrcStr << endl;
- return 0;
- }
0 0
- 字符串的左旋转操
- 字符串的左旋转
- 字符串的左旋转
- 字符串的左旋转
- 字符串的左旋转
- 字符串的左旋转最佳解法
- C语言实现字符串的左旋转
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 26.左旋转字符串
- 第一章、左旋转字符串
- 第一章、左旋转字符串
- 第一章、左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 6.6 First Missing Positive
- 一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。
- Cython红黑树版
- struts2 result type=stream
- 常用idea快捷键
- 字符串的左旋转操
- 关于SVN目录结构分布
- iOS系类教程之用instruments来检验你的app
- mysql 字符集问题
- 使用Xcode和Instruments调试解决iOS内存泄露
- 关于@media无法识别问题
- XCode Debug
- xCode 4.2如何检测程序在真机中的内存占用
- 代码里打印程序所占用的内存