C语言:判断一个字符串是否为另外一个字符串旋转之后的字符串。

define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <string.h>
void reserve(char *left, char*right)
{
 while (left < right)
 {
  char tmp = *left;
  *left = *right;
  *right = tmp;
  left++;
  right--;
 }
}
void left_reserve(char arr[], int k)
{
 int len = strlen(arr) - 1;
 char *pstart = &arr[0];
 char *pend = arr + len;
 reserve(pstart, pstart + k - 1);
 reserve(pstart + k, pend);
 reserve(pstart, pend);
}
void right_reserve(char arr[], int k)
{
 int len = strlen(arr) - 1;
 char *pstart = &arr[0];
 char *pend = arr + len;
 reserve(pstart, pstart + len - k);
 reserve(pend - k+1, pend);
 reserve(pstart, pend);
}
int main()
{
 char arr[10] = "AABCD";
 char arr2[10] = "ABCDA";
 char *p = arr;
 int k = 5;
 while (k)
 {
  left_reserve(arr, k);
  if (strcmp(arr, arr2) == 0)
  {
   printf("1\n");
   break;
  }
  right_reserve(p, k);
  if (strcmp(p, arr2) == 0)
  {
   printf("1\n");
   break;
  }
  k--;
 }
 if (0 == k)
 {
  printf("0\n");
 }
 system("pause");
}

 法1是先判断是否是其左旋再判断是否是右旋,

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

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
 char arr1[20] = "AABCD";
 //strncat连接字符串后长度会变大,要预留足够的长度,以防越界。
 char arr2[] = "BCDAA";
 char *ret;
 strncat(arr1, arr1, strlen(arr1));
 //strcat(arr1, arr1);自身字符串连接时找不到结束标志\0,不能结束,则采用strncat
 //strncat连接字符串,连接长度为 strlen(arr1)
 ret = strstr(arr1, arr2);//arr2是否是arr1的子串
 if (ret != NULL)
 {
  printf("是旋转后的字符串\n");
 }
 else 
 {
  printf("不是旋转后的字符串\n");
 }
 system("pause");
 return 0;
}

 

 

你可能感兴趣的:(C语言:判断一个字符串是否为另外一个字符串旋转之后的字符串。)