左旋转字符串 left rotate string
2012-08-24 04:46
411 查看
左旋转字符串
题目:字符串的左旋转操作:把字符串前面的若干字符移到字符串的后面。例如:字符串abcdefg左旋转2位得到cdefgab。请实现左旋转字符串函数,要求对于长度为n的字符串,时间复杂度为O(n),辅助内存为O(1)。算法思想:
可以利用三次字符串反转操作,来达到左旋转字符串的目的:
1.反转字符串的前半段;
2.反转字符串的后半段;
3.反转整个字符串。
代码如下:
#include<iostream> #include<string.h> using namespace std; // 本函数对string的子串进行反转操作 // start和end分别指明了字串的起始位置和结束位置(左闭右开区间) void revert_string(char* string, int start, int end) { int i=start, j=end-1; char tmp; while(i<j) { tmp = *(string+i); *(string+i) = *(string+j); *(string+j) = tmp; i++; j--; } } // 进行三次反转操作就可以完成左字符串旋转操作 void leftRotateString(char* string, int i) { int len = strlen(string); revert_string(string,0,i); revert_string(string,i,len); revert_string(string,0,len); } int main(){ // declaring string as a char pointer instead of a char array // will cause the program to crash, i.e., using the following declaration // char* string = "This_is_a_sample_string"; // will make the program crash char string[] = "This_is_a_sample_string"; leftRotateString(string, 4); cout<<string<<endl; return 0; }
输出如下:
“_is_a_sample_stringThis”
除了上面的算法,还有一个著名的杂技算法。移动S[0]到临时变量t,然后移动S[K]到S[0];移动S[2K]到S[K],依此类推(将S中的所有下标对n取模),直到返回到取S[0]中的元素,此时改为从t取值然终止过程。当n为12,k为3时,元素按如下顺序移动(如下图,画得太丑了,莫怪)。如果该过程没有移动全部的元素,则从S[1]开始再次移动,直到所有的元素都已经移动位置。
代码如下:
#include<iostream> #include<string> using namespace std; //求两个整数i,j的最大公约数 int gcd(int i,int j) { while(i != j) { if(i > j) i -= j; else j -= i; } return i; } //左旋转字符串函数,将pStr字符串向左旋转k位, //first指向pStr[i],second指向pStr[2i],以此类推 char* LeftRotateString(char* pStr,int k) { if(pStr == NULL || k < 1) return 0; int n = strlen(pStr); //共进行i趟循环,i为n,k的最大公约数 for(int i = 0;i < gcd(n,k);++i) { char temp = pStr[i]; int first = i; while(1) { int second = (first + k) % n; if(second == i) break; pStr[first] = pStr[second]; first = second; } //将临时变量中的字符存至每一趟的循环的最后一个字符中 pStr[first] = temp; } return pStr; } int main() { string demo("abcdefgh"); cout<<demo<<endl; LeftRotateString(&demo[0],3); cout<<demo<<endl; return 0; }
相关文章推荐
- 21.左旋转字符串[LeftRotateString]
- 左旋转字符串LeftRotateString -- 翻转单词顺序
- [LeetCode] Rotate String 旋转字符串
- 【LintCode】Rotate String 旋转字符串
- leetcode——Reverse Words in a String 旋转字符串中单词顺序(AC)
- 数组和字符串(分数统计_stat,单词的长度,乘积的末3位,计算器,旋转_rotate,进制转换1_base1,进制转换2_base2,手机键盘)
- 16. 3. 4. 字体旋转Rotate a line of character (String)AffineTransform
- 字符旋转问题-Rotate the string
- 左旋转字符串。。。rotate()
- string方法 PadLeft 返回一个新字符串,该字符串通过在此实例中的字符左侧填充指定的 Unicode 字符来达到指定的总长度,从而使这些字符右对齐。 PadRight 右边
- C#中String.Format格式说明(如字符串补0 string s="a";s.PadLeft(2,'0'))
- String-------字符串的排列+字符串的旋转(Java)
- 旋转字符串;编程珠玑第二章;rotate a one-dimensional vector;循环移位数组;编程之美
- C#中String.Format格式说明(如字符串补0 string s="a";s.PadLeft(2,'0'))
- STL左旋转字符串Rotate的深入理解和自我实现
- scramble-string——两个字符串经过树化并旋转后是否一致、递归、动态规划
- leetcode——Reverse Words in a String 旋转字符串中单词顺序(AC)
- [CareerCup] 1.8 String Rotation 字符串的旋转
- 旋转字符串(循环移位,rotate)
- 写一个方法 String left(String str ,int n) str字符串中可能包含中文,中文是2bytes