您的位置:首页 > 其它

左旋字符串以及判断一个字符串是否另一个字符串左旋后的字符串

2018-02-28 17:49 344 查看
左旋字符串是一道面试常考的题,听着好像很难的样子,实际上它并没有想象中的那么难,接下来,我就用两种方式来实现左旋字符串。

方法一

循环左移法(思路)

假如说要左旋两位,那么就把字符串中的前两位保存在另一个字符串str里面,然后将剩下的sub中的字符串整体向前移动。最后将sub中的字符串和str中的字符串进行合并就可以得到想要的左旋过后的字符串了。

具体代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void StringRverse(char *pStr,int steps)
{
int length=0,i=0;
char *sub=pStr,*str;
while(*pStr !='\0')
{
length++;
pStr++;
}
pStr--;

if(steps > length)
steps=steps-length;
str=(char *)malloc(steps);

for(i=0;i<steps;i++)
str[i]=sub[i];

for(i=0;i<length-steps;i++)
sub[i]=sub[length-steps+i-2];

for(i=0;i<steps;i++)
sub[length-steps+i]=str[i];
}

int main()
{
char a[]="abcdef";
printf("最初的字符串为: \n%s\n",a);
StringRverse(a,2);
printf("左旋两位后为: \n%s\n",a);

system("pause");
return 0;


*方法二

双倍字符串法

双倍字符串法的算法思想不好想但是很好实现,因为它的实现调用了字符串拷贝的库函数。具体方法是将要进行左旋的字符串str拷到另一个字符串sub中,然后再把两个字符串连接,得到双倍字符串。加入要左旋两位,就在sub字符串中从第三个字符开始拷贝,拷贝length长度个,拷到str字符串,这样str字符串里面就是左旋过后的了

代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void StringRverse(char *pStr,int steps)
{
int length=0;
char *sub=pStr;

while( *sub !='\0')
{
length++;
sub++;
}

char *tmp=(char *)malloc (sizeof(char)*length*2);
assert(tmp);
strcpy(tmp,pStr);
strcat(tmp,pStr);
strncpy(pStr,tmp+steps,length);

}

int main()
{
char a[]="abcdef";

printf("最初的字符串为: \n%s\n",a);
StringRverse(a,2);
printf("左旋两位后为: \n%s\n",a);

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: