字符串旋转结果

简介: 字符串旋转结果

描述



               例如:给定s1 =AABCD和s2 = BCDAA,返回1

               给定s1=abcd和s2=ACBD,返回0.

               AABCD左旋一个字符得到ABCDA

               AABCD左旋两个字符得到BCDAA

               AABCD右旋一个字符得到DAABC


1.常规思路:先判断两个字符大小是否相等,若相等,则以字符串str2为参照,旋转str1,每旋转一次判断是否与str2相等,旋转次数由字符串str1长度决定。


#include<stdio.h>
#include<string.h>
#include<assert.h>
int Rotate(char* str1,char* str2)
{
  assert(str1&&str2);
  int len1 = strlen(str1);
  int len2 = strlen(str2);
  if (len1 != len2)
    return 0;
  else
  {
    while (len1--)
    {
      char temp = str1[0];
      int i = 0;
      for (; i < len1; i++)
      {
        str1[i] = str1[i + 1];
      }
      str1[i] = temp;
      if (strcmp(str1, str2) == 0)
        return 1;
    }
    return 0;
  }
}
int main()
{
  char str1[] = "ABCDEF";
  char str2[] = "DAABC";
  int a=Rotate(str1, str2);
  if(a==1)
    printf("%s是%s旋转得到的结果",str1,str2);
  else
    printf("%s不是%s旋转得到的结果", str1, str2);
  return 0;
}



2.更简单思路:字符串旋转所有的情况都是将字符串拷贝链接后新字符串的字串,只需在新字符串确认是否能查找到字串即可。

bb2cfc38390d4cacbee0394c113618b4.png


#include <stdio.h>
#include<string.h>
int find(const char* str1, const char* str2)
{
  char* p = strstr(str1, str2);
  if (p != NULL)
    return 1;
  else
  {
    return 0;
  }
}
int main()
{
  char str1[] = "AABCD";
  char ret[9] = {0};
  char str2[] = "BCDAA";
  strcpy(ret,str1);
  strcat(ret, str1);
  int a = find(ret, str2);
  if (a == 1)
  {
    printf("%s是%s的旋转字串\n", str1, str2);
  }
  else
  {
    printf("%s不是%s的旋转字串\n", str1, str2);
  }
  return 0;
}


目录
相关文章
|
26天前
字符串逆序
字符串逆序
16 2
|
5月前
14. 最长公共前缀
14. 最长公共前缀
|
5月前
|
Java
5.最长回文子串
5.最长回文子串
|
6月前
14.最长公共前缀
14.最长公共前缀
37 0
|
6月前
|
C++
最长公共前缀(C++)
最长公共前缀(C++)
43 0
|
12月前
替换空格
替换空格
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
【那些年那些题】字符串旋转结果
【那些年那些题】字符串旋转结果
64 0
|
算法 Java 索引
最长回文子串
最长回文子串
120 0
最长回文子串