1.问题
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1
给定s1 = abcd和s2 = ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
2.代码 (VS2019)
#include<stdio.h>
#define max 100
//输出长度
int Len(char* ch)
{
int i = 0;
int len = 0;
for (i = 0; i < max; i++)
{
if (ch[i] != '\0')
{
len++;
}
}
printf("len=%d\n", len);
return len; //返回值很重要 否则主函数中会出错!
}
//左旋
void Span(char* ch, int k,int len)
{
int i = 0;
char tmp[max] = { 0 };
for (i = k; i < len; i++)
{
tmp[i-k] = *(ch + i);
}
for (i = 0; i < k; i++)
{
tmp[len-k+i] = *(ch + i);
}
for (i = 0; i < len; i++)
{
if ((*(tmp+i)) != '\0')
{
printf("%c" ,* (tmp + i));
}
}
printf("\n");
}
//未写出来!
//void Span(char* ch, int k, int len)
//{
// int i = 0;
// char tmp[max] = { 0 };
// for (i = k-1; i >= 0; i--)
// {
// tmp[len] = *(ch + i);
// len--;
// }
// for (i = len - 1; i >= k; i--)
// {
// tmp[len - k] = *(ch + i);
// len--;
// }
// for (i = 1; i <= len; i++)
// {
// printf("%c", *(tmp + i));
// }
// printf("\n");
//}
//对比
void Compare(char* ch, char* ch2,int len,int len2,int k)
{
if (len == len2)
{
int i = 0;
int flag = 0;
for (i = 0; i < (len - k); i++)
//for (i = 0; i < k ; i++) //错误!
{
//if (*(ch + i-k + len ) == *(ch2 + i)) //错误!
if (*(ch + i + k) == *(ch2 + i))
{
flag = 1;
}
else
{
flag = 0;
printf("0\n");
break;
}
}
if (1 == flag)
{
for (i = (len - k); i < len; i++)
//for (i = k; i < len; i++) //错误!
{
//if (*(ch + i - k) == *(ch2 + i)) //错误!
if (*(ch + i - (len - k)) == *(ch2 + i))
{
flag = 1;
}
else
{
flag = 0;
printf("0\n");
break;
}
}
}
if (1 == flag)
{
printf("1\n");
}
}
else
{
printf("0\n");
printf("二者长度不等,不是旋转之后的字符串!\n");
}
}
int main()
{
int k = 0;
char ch[max] = { 0 };
char ch2[max] = { 0 };
printf("请任意输入一串字符串:");
gets(ch);
int len=Len(ch);
printf("请输入你想左旋的个数:");
scanf("%d", &k);
printf("左旋%d个字符后为:",k);
Span(ch, k,len);
printf("请输入你想与之进行判断的字符串:");
getchar();//缓冲区还留下一个 \0
gets(ch2);
int len2 = Len(ch2);
printf("二者比较结果为:");
Compare(ch, ch2,len,len2,k);
return 0;
}
3.运行图
4.问题
1)若函数内调试正确 而在主函数内调回错误 一般返回值有问题 注意return。
2)主要错误点看代码标记。
3)左旋的另一种思路还未写出来—先把前k个逆序 再把后(len-k)个逆序 最后整个逆序得到左旋-有待!
苦战一个下午 冲呀!K-