字符串旋转的若干种算法 (待续)
2016-04-13 22:58
316 查看
题目描述:
对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。测试样例:"AbcdeFgh",8,4 (为了方便起见我把两部分的起始元素用大写字母表示)
返回:"FghAbcde"
思路:
·方法一:将整个字符串左移或右移(p - 1)次
·方法二: 将要分成的前部分或后部分整体移动
·方法三:利用栈
如: 先将FGH放置到前面,变成"FghdeFGH" 。每次覆盖原有元素的时候将原来的元素存入队列中,上述步骤执行完毕后依次从队列中出队并放入对应的位置即可。
代码如下:
string rotateString(string A, int n, int p) { queue<char> que; int i = p; int tmp_i = 0; for (i = p; i < n; i++) { que.push(A[tmp_i]); A[tmp_i] = A[i]; ++tmp_i; } que.push(A[tmp_i]); while (!que.empty()) { A[tmp_i] = que.front(); que.pop(); ++tmp_i; } A[tmp_i] = '\0'; return A; }
·方法四: 三次交换
这是一种很巧妙的算法。下面举例说明:
还是用测试用例中的那段字符串 "AbcdeFgh"
根据p的位置,可以分为两部分 "Abcde" 和 "Fgh"
可以先对两个字符串分别逆序(第一次 和 第二次交换),得到 "edcbAhgF"
然后对整个字符串进行逆序(第三次) 得到 "FghAbcde"
我在方法三中用到了栈,其实是跟该方法类似的思想,
不过这个方法比我自己的方法三不知道高到哪里去了 (◎﹏◎)
·方法五: 合并、并读取
合并时,对于string对象 直接用库里已经重载好的 "+" 操作符即可
(如果要合并两个C风格的字符串,则需要用strcat函数)
例如测试用例的字符串 合并后为 "AbcdeFghAbcdeFgh"
然后再将这个合并后的字符串的第(p + 1)个元素到 (p + 1 + n)个元素按顺序放入原字符串中即可。
代码如下:
string rotateString(string A, int n, int p) { queue<char> que; int i = p; int tmp_i = 0; for (i = p; i < n; i++) { que.push(A[tmp_i]); A[tmp_i] = A[i]; ++tmp_i; } que.push(A[tmp_i]); while (!que.empty()) { A[tmp_i] = que.front(); que.pop(); ++tmp_i; } A[tmp_i] = '\0'; return A; }
相关文章推荐
- 数据库链接字符串查询网站
- Flex字符串比较 还有Flex字符串操作
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法
- VBS的字符串及日期操作相关函数
- C#实现将千分位字符串转换成数字的方法
- jquery 删除字符串最后一个字符的方法解析
- PowerShell实现在字符串中查找大写字母
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- PowerShell中字符串使用单引号和双引号的区别
- Powershell小技巧之获取字符串的行数