c语言判断字符串以另一个子串结尾,C语言:判断一个字符串是否为另外一个字符串旋转之后的字符串。(左旋右旋、求子串)...

法1:

判断是否是其左旋再判断是否是右旋。

#include

#include

#include

void Reverse(char* left, char* right)

{

while (left 

{

char tmp = *left;

*left = *right;

*right = tmp;

left++;

right--;

}

}

char* Left_Reverse(char* arr, int k, int len)//接收,否则无法将变化的字符串和arr2比较

{

char* cur = arr;

Reverse(arr, arr + k - 1);

Reverse(arr + k, arr + len - 1);

Reverse(arr, arr + len - 1);

return cur;

}

char* Right_Reverse(char* arr, int k, int len)//接收

{

char* cur = arr;

Reverse(arr, arr + len - k - 1);

Reverse(arr + len - k, arr + len - 1);

Reverse(arr, arr + len - 1);

return cur;

}

int main()

{

char arr1[] = "AABCD";

char arr2[] = "CDAAB";

int len = strlen(arr1);

int k = 0;

//判断是否左旋得到

for (k = 0; k 

{

char* ret1 = Left_Reverse(arr1, k, len);

if (strcmp(ret1, arr2) == 0)

{

printf("左旋\n");

break;

}

}

//判断是否右旋得到

char _arr1[] = "AABCD";  //之前的arr1经过左旋后已经发生了改变

k = strlen(arr1);  //k = len主要想从不旋转开始比较字符串

char* ret2 = NULL;

while (k > 0)

{

ret2 = Right_Reverse(_arr1, k, len);

if (strcmp(ret2, arr2) == 0)

{

printf("右旋\n");

break;

}

k--;

}

if ((k == 0) && (strcmp(ret2, arr2) != 0))

{

printf("既不是左旋又不是右旋\n");

}

system("pause");

return 0;

}

法2:

判断一个字符串是否是另一个字符串自身连接的子串。

假设两个字符串分别为ABCD和DCBA,将第一个字符串“ABCD”连接成新的字符串“ABCDABCD”。再比较新的字符串"ABCDABCD“与字符串”DCBA“,判断字符串”DCBA“是不是另一个字符串的子串。如果是,则说明是旋转字符串。

#define _CRT_SECURE_NO_WARNINGS 1

#include

#include

#include

#include

char* my_strncat(char* dest, char* src, int size)

{

assert(dest);

assert(src);

char* tmp = dest;

while (*dest)

{

dest++;

}

while (size)

{

*dest++ = *src++;

size--;

}

*dest = '\0';

return tmp;

}

int main()

{

char arr1[15] = "AABCD";

char arr2[] = "BCDAA";

int len = strlen(arr1);

char* ret1 = my_strncat(arr1, arr1, len);//ret1是arr1自己连接自己后的字符串

char* ret2 = strstr(ret1, arr2);

if (*ret2 == NULL)

{

printf("不是!");

}

else

{

printf("是!");

}

system("pause");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值