字符串的旋转
2015-07-07 16:54
302 查看
解法一:暴力移位
初看此题,可能最先想到的方法是将需要移动的字符一个一个地移动到字符串的尾部。
如果定义指向该字符串的一个指针s,然后设该字符串的长度为n,那么,可以先编写一个函数LeftShiftOne(char* s, int n),以完成将一个字符移动到字符串尾部的功能,然后再调用m次LeftShiftOne函数,使得字符串开头的m个字符移动到字符串的尾部。
这样,就完成了将若干个字符移动到尾部的要求。
下面,分析一下这种方法的时间复杂度和空间复杂度。针对长度为n的字符串来说,假设需要移动m个字符到字符串的尾部,那么总共需要 m×n 次操作。同时设立一个变量保存第一个字符,如此,时间复杂度为O(mn),空间复杂度为O(1)。
解法二:三次翻转
即把字符串先分为两个部分,再各自反转,最后整体反转的方法,时间复杂度为O(n),空间复杂度为O(1)。
编程之美:数组循环移位
解法三:
可以用带头尾指针的双向链表存储字符串用空间换时间,效率相当快平均下来O(n/2)。
初看此题,可能最先想到的方法是将需要移动的字符一个一个地移动到字符串的尾部。
如果定义指向该字符串的一个指针s,然后设该字符串的长度为n,那么,可以先编写一个函数LeftShiftOne(char* s, int n),以完成将一个字符移动到字符串尾部的功能,然后再调用m次LeftShiftOne函数,使得字符串开头的m个字符移动到字符串的尾部。
这样,就完成了将若干个字符移动到尾部的要求。
下面,分析一下这种方法的时间复杂度和空间复杂度。针对长度为n的字符串来说,假设需要移动m个字符到字符串的尾部,那么总共需要 m×n 次操作。同时设立一个变量保存第一个字符,如此,时间复杂度为O(mn),空间复杂度为O(1)。
解法二:三次翻转
即把字符串先分为两个部分,再各自反转,最后整体反转的方法,时间复杂度为O(n),空间复杂度为O(1)。
编程之美:数组循环移位
解法三:
可以用带头尾指针的双向链表存储字符串用空间换时间,效率相当快平均下来O(n/2)。
相关文章推荐
- Android Quantity Strings 的 getQuantityString方法取值问题
- 一、linux下nginx1.7.8+php5.6.3的环境配置
- css阴影
- 黑马程序员——正则表达式-整理笔记
- string 流(sstream头文件下属的三个类型)
- JS+CSS简单实现DIV遮罩层显示隐藏
- 二维码创建及扫描
- iOS第三方之FMDB
- TextKit简单用法(图文混排)
- 最大不能表示的数
- 多线程C调用python api的陷阱
- 用eclipse zest来画拓扑图(可以在表格布局中自动展开拓扑图)
- android操作sqlite数据库
- 浅论Android网络请求库——android-async-http(转)
- Bitmap转灰度字节数组byte[]
- C++去除输入行中空白的方法
- apk的classes.dex的校检
- 使用myeclipse的反向工程来生成相应的hibernate映射文件和POJO类
- 互联网创业:广州为何被边缘化
- arm系统启动后运行 helloworld ("hello world" 被封装为ramdisk)