您的位置:首页 > 其它

字符串处理------旋转

2016-04-23 17:29 260 查看
知识梳理—-字符串

一.字符串的旋转

字符串的旋转在形式上如同将一个字符串像位操作那样进行循环左移或者右移。常见的方法是使用暴力进行,即每次记录最左边的字符S并将其余字符向左移动一位,然后将S放在最右边的位置。将此过程循环进行N次,即可实现字符串前N为的旋转。

暴力法代码:

(时间复杂度O(mn), 空间复杂度O(1))

#include <iostream>
#include <string.h>
using namespace std;

void leftRotateString(char *str, int m, int n);     //实现长度为m的字符串前n为的旋转
void leftShiftOne(char *str, int m);                //实现最左边一个字符的旋转

int main()
{
char *str = new char[10];
memcpy(str, "abcdef", 6);

cout << "Before rotate: " << str << endl;
leftRotateString(str, m, n);
cout << "After rotate: " << str << endl;

return 0;
}
void leftShiftOne(char *str, int m)
{
char ch = str[0];
for(int i = 1; i < m; i++)
{
str[i - 1] = s[i];
}
str[m - 1] = ch;
}

void leftRotateString(char *str, int m, int n)
{
for(int i = 0; i < n; i++)
{
leftShiftOne(str, m);
}
}


另外一种比较好的方法是——三步反转,其具体步骤是:

将原始字符串分为待旋转部分X和不变部分Y;

分别反转两个部分并从新合并为一个字符串;

将合并后的字符串反转;

eg: 旋转前三个字符

“abcdef” —> “abc” && “def” —> “cba” && “fed” —>”cbafed” —> “defabc”

三步反转:

(时间复杂度O(n), 空间复杂度O(1)).

#include <iostream>
#include <string.h>
using namespace std;

void reverseString(char *str, int from, int to);
void leftRotateString(char *str, int m, int n);

int main()
{
char *str = new char[10];
memcpy(str, "abcdef", 6);

cout << "Before rotate: " << str << endl;
leftRotateString(str, m, n);
cout << "After rotate: " << str << endl;

return 0;
}

void reverseString(char *str, int from, int to)
{
while(from < to)
{
char ch = str[from];
str[from] = str[to];
str[to] = ch;
from++;
to--:
}
}

void leftRotateString(char *str, int m, int n)
{
n %= m;          //若旋转位数n大于字符长度m,则取余
reverseString(str, 0, n - 1);
reverseString(str, n, m - 1);
reverseString(str, 0, m - 1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串处理