📌  相关文章
📜  C程序检查字符串是否相互旋转

📅  最后修改于: 2022-05-13 01:57:08.561000             🧑  作者: Mango

C程序检查字符串是否相互旋转

给定一个字符串s1 和一个字符串s2,写一个片段来说明 s2 是否是 s1 的旋转?
(例如,给定 s1 = ABCD 和 s2 = CDAB,返回真,给定 s1 = ABCD,和 s2 = ACBD,返回假)


算法:
areRotations(str1, str2)

1. Create a temp string and store concatenation of str1 to
       str1 in temp.
                          temp = str1.str1
    2. If str2 is a substring of temp then str1 and str2 are 
       rotations of each other.

    Example:                 
                     str1 = "ABACD"
                     str2 = "CDABA"

     temp = str1.str1 = "ABACDABACD"
     Since str2 is a substring of temp, str1 and str2 are 
     rotations of each other.
C
// C program to check if two given strings are rotations of 
// each other
# include 
# include 
# include 
  
/* Function checks if passed strings (str1 and str2)
   are rotations of each other */
int areRotations(char *str1, char *str2)
{
  int size1   = strlen(str1);
  int size2   = strlen(str2);
  char *temp;
  void *ptr;
  
  /* Check if sizes of two strings are same */
  if (size1 != size2)
     return 0;
  
  /* Create a temp string with value str1.str1 */
  temp   = (char *)malloc(sizeof(char)*(size1*2 + 1));
  temp[0] = '';
  strcat(temp, str1);
  strcat(temp, str1);
  
  /* Now check if str2 is a substring of temp */
  ptr = strstr(temp, str2);
  
  free(temp); // Free dynamically allocated memory
  
  /* strstr returns NULL if the second string is NOT a
    substring of first string */
  if (ptr != NULL)
    return 1;
  else
    return 0;
}
  
/* Driver program to test areRotations */
int main()
{
    char *str1 = "AACD";
    char *str2 = "ACDA";
  
    if (areRotations(str1, str2))
       printf("Strings are rotations of each other");
    else
       printf("Strings are not rotations of each other");
  
    getchar();
    return 0;
}



输出:
Strings are rotations of each other

使用的库函数:
字符串:
strstr 在 string 中查找子字符串。
原型:char * strstr(const char *s1, const char *s2);
有关详细信息,请参阅 http://www.lix.polytechnique.fr/Labo/Leo.Liberti/public/computing/prog/c/C/MAN/strstr.htm

字符串:
strncat 连接两个字符串
原型:char *strcat(char *dest, const char *src);
有关详细信息,请参阅 http://www.lix.polytechnique.fr/Labo/Leo.Liberti/public/computing/prog/c/C/MAN/strcat.htm

时间复杂度:这个问题的时间复杂度取决于 strstr函数的实现。
如果 strstr 的实现是使用 KMP 匹配器完成的,则上述程序的复杂度为 (-)(n1 + n2) 其中 n1 和 n2 是字符串的长度。 KMP 匹配器花费 (-)(n) 时间在长度为 n 的字符串中查找子字符串,其中假设子字符串的长度小于字符串。
请参阅 A Program 上的完整文章以检查字符串是否相互旋转以获取更多详细信息!