字符串的左旋和判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言实现)

简介: 字符串的左旋和判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言实现)

1. 字符串的左旋

题目:

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

解析:该题有两种解决方法(我能想到的)。

  • 第一种:直接暴力解法

#include<stdio.h>
#include<string.h>
//第一个方法:暴力旋转,也就是枚举。
//a是传进来的数组首元素地址,k是要左旋的个数
void leftMoveStrOne(char* a, int k) {
  //先计算该数组有多长
  size_t len = strlen(a);
  //如果k是大于len,说明k旋转了一周或者n周,所以要取模
  k = k % len;
  for (int i = 0;i < k;i++) {
    //将第一个数组元素保存起来
    int tmp = a[0];
    size_t j = 0;
    //这里为什么需要len - 1呢,因为怕越界了
    //例如:有5个元素,下标最多到4,而j + 1可能会到5,所以越界了!
    for (j = 0;j < len - 1;j++) {
      a[j] = a[j + 1];
    }
    a[len - 1] = tmp;
  }
}
int main() {
  char str[]= "ABCDE";
  leftMoveArrOne(str, 2);
  printf("%s", str);
  return 0;
  /*char str[]= "ABCDE";
  leftMoveStrTow(str, 2);
  printf("%s", str);*/
  return 0;
}

运行结果如下:

  • 第二种:三步翻转法,也叫三步逆序法。

//第二种方法:三步翻转法,也叫三步逆序法。
//先写一个逆序的方法
void reverse(char* left, char* right) {
  while (left < right) {
    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
}
void leftMoveStrTow(char* str, int k) {
  size_t len = strlen(str);
  k = k % len;
  reverse(str, str + k - 1);//第一次翻转
  reverse(str + k, str + len - 1);//第二次翻转
  reverse(str, str + len - 1);//第三次翻转
}
int main() {
  char str[]= "ABCDE";
  leftMoveStrTow(str, 2);
  printf("%s", str);
  return 0;
}

运行结果如下:

2. 判断一个字符串是否为另外一个字符串旋转之后的字符串

题目:

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

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

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

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

解析:该题有两种解决方法(我能想到的)。

  • 第一种:直接暴力解法

不断地左旋,得到一个新的字符,然后去判断两个字符串是不是相等!

//第一种方法:暴力破解法,枚举
//s1是要匹配的字符串,s2是去匹配s1的字符串
int isLeftMove(char* s1, char* s2) {
  size_t lens1 = strlen(s1);
  size_t lens2 = strlen(s2);
  if (lens1 != lens2) {
    return 0;
  }
  size_t i = 0;
  for (i = 0;i < lens1;i++) {
    char tmp = s2[0];
    size_t j = 0;
    for (j = 0;j < lens1 - 1;j++) {
      s2[j] = s2[j + 1];
    }
    s2[lens1 - 1] = tmp;
    if (strcmp(s1, s2) == 0) {
      return 1;
    }
  }
  return 0;
}
int main() {
  char s1[20] = "abcde";
  char s2[] = "bcdea";
  int flag = isLeftMove(s1, s2);
  printf("%d", flag);
  return 0;
}

运行结果如下:

  • 第二种:拼接比较法

//第二种方法:拼接比较法
int isLeftMovePlus(char* s1, char* s2) {
  size_t lens1 = strlen(s1);
  size_t lens2 = strlen(s2);
  if (lens1 != lens2)
    return 0;
  char* start = strncat(s1, s1, lens1);
  //用strstr()函数判断s2是不是s1的子串
  if (strstr(start, s2) == NULL)
    return 0;
  else
    return 1;
}
int main() {
  char s1[20] = "abcde";
  char s2[] = "bcdea";
  int flag = isLeftMove(s1, s2);
  printf("%d", flag);
  return 0;
}

运行结果如下:

相关文章
|
1月前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现2
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
5天前
|
C语言
C语言中 字符串和数字的相互转换
C语言中 字符串和数字的相互转换
10 1
|
16天前
|
C语言 C++
C语言利用ASCII码表统计字符串每个字符出现的次数
C语言利用ASCII码表统计字符串每个字符出现的次数
15 0
|
18天前
|
存储 C语言
C语言中字符串的引用与数组元素操作
C语言中字符串的引用与数组元素操作
21 0
|
18天前
|
安全 C语言
指针与字符串:C语言中的深入探索
指针与字符串:C语言中的深入探索
15 0
|
1月前
|
存储 C语言
爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗
爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗
|
1月前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
2月前
|
存储 编译器 C语言
在C语言中的数组和字符串
在C语言中的数组和字符串
|
9月前
|
存储 机器学习/深度学习 Linux
【C语言】语言篇——数组和字符串
【C语言】语言篇——数组和字符串
38 0
|
9月前
|
存储 C语言
C语言之指针(指针数组以及指针的指针和字符串)
C语言之指针(指针数组以及指针的指针和字符串)
71 0