【那些年那些题】字符串旋转结果

简介: 【那些年那些题】字符串旋转结果

题目描述:


写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

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

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

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC


思路分析:


  思路一:穷举遍历所有需要旋转字符串的所有旋转结果,然后逐一进行比较。

  思路二:先给需旋转字符串后追加一个旋转字符串,这样所有的旋转结果都会成为这个字符串的子集,然后判断是否是该字符串的子集即可。


编程逻辑:


首先要判断两个字符串的长度是否一样,如果不一样,那么就一定不可能旋转得到另一个字符串。

 一:获取字符串长度决定最大循环次数,然后每旋转一次都和另一个字符串比较一次,直到两个字符串相同,或者循环结束。

 二:先使用strncat函数给第一个字符串自追加该字符串,然后再用strstr判断第二字符串是否为第一个字符串追加之后的子集。


代码实现:


int judge_left_move(char arr1[], char arr2[]) {
  int len = strlen(arr2);
  int j;
  for (j = 0; j < len; j ++) {
    char tmp = arr2[0];
    int i;
    for (i = 0; i < len - 1; i++) {
      arr2[i] = arr2[i + 1];
    }
    arr2[len - 1] = tmp;
    if (strcmp(arr1, arr2) == 0)
      return 1;
  }
  return 0;
}
int main() {
  char arr1[] = "ABCDE";
  char arr2[] = "CDEAB";
  int ret;
  if (strlen(arr1) != strlen(arr2)) {
    ret = 0;
    goto end;
  }
  ret = judge_left_move(arr1, arr2);
end:
  if (ret)
    printf("YES");
  else
    printf("NO");
  return 0;
}
int judge_left_move(char arr1[], char arr2[]) {
  int len = strlen(arr1);
  strncat(arr1, arr1, len);
  char* ret = strstr(arr1, arr2);
  if (ret == NULL)
    return 0;
  else
    return 1;
}
int main() {
  char arr1[] = "ABCDE";
  char arr2[] = "CDEAB";
  int ret;
  if (strlen(arr1) != strlen(arr2)) {
    ret = 0;
    goto end;
  }
  ret = judge_left_move(arr1, arr2);
end:
  if (ret)
    printf("YES");
  else
    printf("NO");
  return 0;
}


目录
相关文章
字符串旋转结果
字符串旋转结果
46 0
|
C语言
【C语言练习】字符串旋转你会嘛?
【C语言练习】字符串旋转你会嘛?
128 0
|
C语言
字符串旋转——C语言
字符串旋转——C语言
140 0
字符串旋转——C语言
|
9月前
|
Python
ptthon字符串的逆序输出
字符串的逆序输出
51 0
字符串函数_strtok()
strtok是用来切割字符串的,引用头文件为#include<string.h> strtok函数的声明:
|
C语言
字符串的左旋和判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言实现)
字符串的左旋和判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言实现)
20天刷题计划-344. 反转字符串
需要反转数组,且不允许生成新的数组,使用双指针的方法。思路如下: 初始指针 left ,right 分别向字符串的开始和末尾,指针每次各移动一次,使左右指针慢慢靠近,每次交换左右指针指向的元素。循环结束情况如下:
|
机器学习/深度学习 NoSQL Shell
344. 反转字符串
344. 反转字符串
122 0

热门文章

最新文章