字符串循环移位

题目示例: "abcdefgh" 循环右移3位得到 "defghabc"

解法一:消耗额外的3个空间,空间复杂度为O(n),当程序运行的空间比较苛刻的时候,不可取。时间复杂度为O(n)

1 int main(){
2     char source[]="abcdefg";
3     char *temp=new char[3];
4     int i;
5     for(i=0;i<3;i++)temp[i]=source[i];
6     for(i=0;i<(strlen(source)-3);i++)source[i]=source[i+3];
7     for(i=0;i<3;i++)source[strlen(source)-3+i]=temp[i];
8     cout<<source<<endl;
9 }

解法二:将每个元素直接移动到最后移动完字符串的相应的位置,所以需要移动n次。首先从x[0]开始,然后移动想想x[m]到x[0],x[2m]到x[i],依此类推,直到返回取x[0],如果从x[0]开始,没有能够移动所有元素,就从x[1]继续移动,直到所有元素都移动完为止。该算法的时间复杂度取决于外层循环执行的次数,当n,m的最大公倍数为1,则外层循环执行一次,如果最大公倍数为k,则执行k次。所以其时间复杂度几乎也为O(n)。解法2的空间复杂度较低,只占用一个字符的额外空间,为O(1)。

 1 int main(){
 2     char source[]="abcdef";
 3     int n=strlen(source);
 4     int m;cin>>m;//m为循环右移位数
 5     m=m%n;
 6     if(m==0)return 1;
 7
 8     int start_pos=0;
 9     int changecount=0;
10
11     while(changecount<n){
12         char temp=source[start_pos];
13         int cur_pos=start_pos;
14         int next_pos=(cur_pos+m)%n;
15         while(next_pos!=start_pos){
16             source[cur_pos]=source[next_pos];
17             changecount++;
18             cur_pos=next_pos;
19             next_pos=(cur_pos+m)%n;
20         }
21         source[cur_pos]=temp;
22         changecount++;
23         start_pos++;
24     }
25     cout<<source<<endl;
26 }

解法三:观察移位后的字符串和原串的差别,字符串移n位相当于把前n位挪到了后面,而把后n位移到前面。设字符串长为AB,完成移位操作后新串为BA,用A‘表示A的反序串,B‘表示B的反序串,那么 BA = B‘‘A‘‘ =(A‘B‘)‘。

 1 void reverse(char *a,int start,int end){
 2     while(start<end){
 3         int temp=a[start];
 4         a[start]=a[end];
 5         a[end]=temp;
 6         start++;
 7         end--;
 8     }
 9 }
10
11 int main(){
12     char source[]="abcdef";
13     int n=strlen(source);
14     int m;cin>>m;//m为循环右移位数
15     m=m%n;
16     if(m==0)return 1;
17
18     reverse(source,0,m-1);
19     reverse(source,m,n-1);
20     reverse(source,0,n-1);
21     cout<<source<<endl;
22 }

解法四:比较巧妙的做法就是对于字符串s,使newstring=ss,循环移n位的结果就等于newstring从下标n取strlen(s)位。如下题:

 1 int main(){
 2     vector<string> vec;
 3     int n;cin>>n;
 4     string s;
 5     for(int i=0;i<n*2;i++){cin>>s;vec.push_back(s);}
 6     int j=1;
 7     for(int i=1;i<vec.size();i=i+2){
 8         string temp=vec[i-1]+vec[i-1];
 9         int pos=temp.find(vec[i],0);
10         if(pos>3)cout<<"Case "<<j<<": "<<(3-pos)<<endl;
11         else
12             cout<<"Case "<<j<<": "<<pos<<endl;
13         j++;
14     }
15
16 }
时间: 2024-10-10 20:57:34

字符串循环移位的相关文章

字符串问题经典问题

一.字符串循环移位问题: 给定一个字符串S[0...N-1],要求把S的前k个字符移动到S的尾部,如把字符串“abcdef”向左移动2位得到“cdefab”. 循环左移n+k位和k位的结果是一样的: 循环右移k位相当于循环左移n-k位. 算法要求:时间复杂度O(n), 空间复杂度O(1). 不能采用BF,时间复杂度为O(kN); 这里采用类似矩阵逆置的思想:(XTYT)T=  YX. /** * 该算法实现将字符串循环左移k位 * @param s * @param k * @return */

字符串移位

字符串循环移位:假设有一串字符串a,b,c,d,e,f,g,h,向左循环移位2为,得c,d,e,f,g,h,a,b. #include<iostream> using namespace std; void reverse(char* a, int start, int len){ int count = 0; for(int i = start, j = start + len -1; ; ++i, --j){ if((++count) <= len/2){ a[i] = a[i] +

编程珠玑--左旋字符串

其实编程之美也有类似的题,这道题是编程珠玑第二章的题目. 题目描述:给定一个字符串,将字符串循环移位K次. 最简答的方法就是,通过O(n)的辅助空间,将数组循环移位,时间复杂度就是O(n) 但是如果要求空间复杂度为O(1)呢? 观察规律可知,对前K位反转以及后面的反转,最后对整个字符串反转就能达到O(1)的空间复杂度. PS:注意处理k>字符串的长度的情况 1 #include <iostream> 2 #include <string> 3 4 using namespac

Leetcode题解——数据结构之字符串

1. 字符串循环移位包含 2. 字符串循环移位 3. 字符串中单词的翻转 4. 两个字符串包含的字符是否完全相同 5. 计算一组字符集合可以组成的回文字符串的最大长度 6. 字符串同构 7. 回文子字符串个数 8. 判断一个整数是否是回文数 9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数 1. 字符串循环移位包含 编程之美 3.1 s1 = AABCD, s2 = CDAA Return : true 给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环

RSA公钥算法详解

1970年左右科学家们开始思考公钥加密系统的可能性.经过科学家多年的研究,终于在1977年时,来自MIT的Ron Rivest,AdiShamir和Leonard Adlemn三个人合写了一篇论文,给出了至今仍然安全的公钥加密算法,即以三个人姓氏的首字母命名的RSA算法. RSA的过程步骤如下: 1)       找两个大质素p和q 2)       设n=p·q 算出m=(p-1)(q-1) 3)       找出e和d,使得 e·d mod = 1 (随便找出一个与m互质的数e,求解方程e·

编程珠玑第二章

编程珠玑第二章 A题 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中一32位整数. 1.在文件中至少存在这样一个数? 2.如果有足够的内存,如何处理? 3.如果内存不足,仅可以用文件来进行处理,如何处理? 答案: 1.32位整数,包括-2146473648~~2146473647,约42亿个整数,而文件中只有40亿个,必然有整数少了. 2.如果采用位数思想来存放,则32位整数最多需要占用43亿个位.约512MB的内存空间. 可以采用前一章的位处理方法.然后判断每个in

跨越千年的RSA算法

跨越千年的RSA算法 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思维游戏中.直到计算机诞生之后,几千年来的数论研究成果突然有了实际的应用,这个过程可以说是最为激动人心的数学话题之一.最近我在<程序员>杂志上连载了<跨越千年的 RSA 算法>,但受篇幅限制,只有一万字左右的内容.其实,从数论到 RSA 算法,里面的数学之美哪里是一万字能扯完的?在写作的过程中,我查了很多资料,找到了很多漂亮的例子,也积累了很多个人的思考

【高德地图API】从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图

下面是基于KWIC 的关键字匹配算法(管道+过滤器模式下实现) 关键部分的管道+过滤器 软件体系下的实现, 在很多的关键字搜索平台都使用了这一 循环移位+排序输出的 关键字匹配算法: 具体需求如下: 1.使用管道-过滤器风格: 每个过滤器处理数据,然后将结果送至下一个过滤器,.要有数据传入,过滤器即开始工作.过滤器之间的数据共享被严格限制在管道传输 四个过滤器: 输入(Input filter): 从数据源读取输入文件,解析格式,将行写入输出管道 移位(CircularShifter filte

基于KWIC 的关键字匹配算法(管道+过滤器模式下实现)

下面是基于KWIC 的关键字匹配算法(管道+过滤器模式下实现) 关键部分的管道+过滤器 软件体系下的实现, 在很多的关键字搜索平台都使用了这一 循环移位+排序输出的 关键字匹配算法: 具体需求如下: 1.使用管道-过滤器风格: 每个过滤器处理数据,然后将结果送至下一个过滤器,.要有数据传入,过滤器即开始工作.过滤器之间的数据共享被严格限制在管道传输 四个过滤器: 输入(Input filter): 从数据源读取输入文件,解析格式,将行写入输出管道 移位(CircularShifter filte