字符串左旋算法

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


//指针翻转法
//方法一


void rotate(string &str,int m)
{
if(str.length() == 0 || m<=0)
return;
int n = str.length();
if(m%n<=0)
return;
int p1 = 0,p2 = m;
int k = (n-m)-n%m;


while(k--)
{
swap(str[p1],str[p2]);
p1++;
p2++;
}


int r = n - p2;
while(r--)
{
int i = p2;
while(i>p1)
{
swap(str[i],str[i-1]);
i--;
}
p2++;
p1++;
}
}
//指针翻转法方法二


void rotate1(string &str,int m)
{
if(str.length()==0 ||m<0)
return;
int p1=0,p2=m;
int n = str.length();
if(m%n==0)
return;
while(true)
{
swap(str[p1],str[p2]);
p1++;
if(p2<n-1)
p2++;
else
break;
}
int r=m-n%m;
while(r--)
{
int i=p1;
char temp=str[p1];
while(i<p2)
{
str[i]=str[i+1];
i++;
}
str[p2]=temp;
}
 }


//递归转换法
void rotate2(string &str,int n,int m,int head,int tail,bool flag)
{
if(head ==tail ||m<=0)
return;
if(flag==true)
{
int p1=head;
int p2=head+m;
int k=n-m-n%m;
for(int i=0;i<k;i++,p1++,p2++)
swap(str[p1],str[p2]);
rotate2(str,n-k,n%m,p1,tail,false);
}
else
{
int p1=tail;
int p2=tail-m;
int k=n-m-n%m;
for(int i=0;i<k;i++,p1--,p2--)
swap(str[p1],str[p2]);
rotate2(str,n-k,n%m,head,p1,true);
}
}


//三步旋转法


char *invert(char *start,char *end)
{
char tmp,*ptmp = start;
while(start!=NULL && end!=NULL &&start<end)
{
tmp = *start;
*start=*end;
*end=tmp;
start++;
end--;
}
return ptmp;
}
char *left(char *s,int pos)
{
int len=strlen(s);
invert(s,s+(pos-1));
invert(s+pos,s+(len-1));
invert(s,s+(len-1));
return s;
}

//暴力移位法


void leftshiftone(char *s,int n)
{
char t = s[0];//保存第一个字符
for(int i=1;i<n;i++)
{
s[i-1]=s[i];
}
s[n-1]=t;


}
//左移m位
void leftshift(char *s,int n,int m)
{
while(m--)
{
leftshiftone(s,n);
}

}

int main()
{
//暴力移位法
/*
char p[12]={'a','b','c','d','e','f','g','h','i','j','k','0'};
leftshift(p,11,3);
for(int i=0;i<11;i++)
{
cout<<p[i];
}
*/
//指针翻转法
/*
string ch="abcdefghijk";
//rotate(ch,3);//指针翻转法1
rotate1(ch,3);//指针翻转法2
cout<<ch<<endl;
*/
//递归转换法
/*
int i=3;
string ch="abcdefghijk";
int len = ch.length();
rotate2(ch,len,i%len,0,len-1,true);
cout<<ch.c_str()<<endl;
*/


char p[13]={'a','b','c','d','e','f','g','h','i','j','k','\0'};
cout<<left(p,3);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值