您的位置:首页 > 其它

判断一个字符串是否是另一个字符串翻转后的结果

2017-08-13 14:08 387 查看
字符串abcdef向左翻转一位的结果为fabcde,向右翻转翻转一位的结果为bcdefa.向左翻转两位的结果为efabcd,向右翻转两位的结果为cdefab。

要判断一个字符串是否是另一个字符串翻转后的结果,必须遍历向左翻转和向右翻转0-len(arr)-1位的所有情况。

我定义了一个翻转函数reverse,返回值为空,参数为两个指针,第一个是翻转的起始地址,第二个是翻转的结束地址。要想实现向左翻转n位的效果,先对字符串整体翻转,然后把第n位,到len(arr)-1位进行翻转就得到了向左翻转的结果。要实现向右翻转,也是对整体翻转,然后把第0位到第n位进行翻转就得到了向右翻转的结果。

为了节约空间,我没有开辟其他数组,所以每次翻转后,还需要把字符串恢复为原始的abcdef。

实现代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reverse(char* begin, char* end)
{
int tmp = 0;
//char* p = begin;
while (begin< end)
{
tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}

}
int cmp_reverse(char arr[], char arr2[],int len,char * begin)
{
if (strcmp(arr, arr2) == 0)
{
return 1;
}
for (int i = 1; i < len; i++)
{
reverse(begin, begin + len-1);
reverse(begin+i, begin + len-1);
if (strcmp(arr, arr2) == 0)
{
return 1;
}
else
{
reverse(begin + i, begin + len - 1);
reverse( begin, begin + len - 1);

}
}
for (int i = 1; i < len; i++)
{
reverse(begin, begin + len - 1);
reverse(begin , begin+ len -1 -i);
reverse(begin + len - i, begin + len - 1);
if (strcmp(arr, arr2) == 0)
{
return 1;
}
else
{
reverse(begin + len - i, begin + len - 1);
reverse(begin, begin + len - 1 - i);
reverse(begin, begin + len -1);

}
}
return 0;
}
int main()
{
char arr[] = "abcdef";
char arr2[] = "cdefab";
int len = strlen(arr);
char * begin = arr;
//char * end = &arr[len - 1];
//char * p = end;
if (cmp_reverse(arr,arr2,len,begin) == 1)
printf("y");
else
printf("n");

//printf("%s", arr);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 指针 遍历
相关文章推荐