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


    目录

    1. 字符串的左旋

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


    1. 字符串的左旋

    题目:

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

    例如:

    ABCD左旋一个字符得到BCDA

    ABCD左旋两个字符得到CDAB

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

    • 第一种:直接暴力解法

    1. #include
    2. #include
    3. //第一个方法:暴力旋转,也就是枚举。
    4. //a是传进来的数组首元素地址,k是要左旋的个数
    5. void leftMoveStrOne(char* a, int k) {
    6. //先计算该数组有多长
    7. size_t len = strlen(a);
    8. //如果k是大于len,说明k旋转了一周或者n周,所以要取模
    9. k = k % len;
    10. for (int i = 0;i < k;i++) {
    11. //将第一个数组元素保存起来
    12. int tmp = a[0];
    13. size_t j = 0;
    14. //这里为什么需要len - 1呢,因为怕越界了
    15. //例如:有5个元素,下标最多到4,而j + 1可能会到5,所以越界了!
    16. for (j = 0;j < len - 1;j++) {
    17. a[j] = a[j + 1];
    18. }
    19. a[len - 1] = tmp;
    20. }
    21. }
    22. int main() {
    23. char str[]= "ABCDE";
    24. leftMoveArrOne(str, 2);
    25. printf("%s", str);
    26. return 0;
    27. /*char str[]= "ABCDE";
    28. leftMoveStrTow(str, 2);
    29. printf("%s", str);*/
    30. return 0;
    31. }

     运行结果如下:

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

    1. //第二种方法:三步翻转法,也叫三步逆序法。
    2. //先写一个逆序的方法
    3. void reverse(char* left, char* right) {
    4. while (left < right) {
    5. char tmp = *left;
    6. *left = *right;
    7. *right = tmp;
    8. left++;
    9. right--;
    10. }
    11. }
    12. void leftMoveStrTow(char* str, int k) {
    13. size_t len = strlen(str);
    14. k = k % len;
    15. reverse(str, str + k - 1);//第一次翻转
    16. reverse(str + k, str + len - 1);//第二次翻转
    17. reverse(str, str + len - 1);//第三次翻转
    18. }
    19. int main() {
    20. char str[]= "ABCDE";
    21. leftMoveStrTow(str, 2);
    22. printf("%s", str);
    23. return 0;
    24. }

     运行结果如下: 

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

    题目:

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

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

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

    AABCD左旋一个字符得到ABCDA

    AABCD左旋两个字符得到BCDAA

    AABCD右旋一个字符得到DAABC

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

    • 第一种:直接暴力解法

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

    1. //第一种方法:暴力破解法,枚举
    2. //s1是要匹配的字符串,s2是去匹配s1的字符串
    3. int isLeftMove(char* s1, char* s2) {
    4. size_t lens1 = strlen(s1);
    5. size_t lens2 = strlen(s2);
    6. if (lens1 != lens2) {
    7. return 0;
    8. }
    9. size_t i = 0;
    10. for (i = 0;i < lens1;i++) {
    11. char tmp = s2[0];
    12. size_t j = 0;
    13. for (j = 0;j < lens1 - 1;j++) {
    14. s2[j] = s2[j + 1];
    15. }
    16. s2[lens1 - 1] = tmp;
    17. if (strcmp(s1, s2) == 0) {
    18. return 1;
    19. }
    20. }
    21. return 0;
    22. }
    23. int main() {
    24. char s1[20] = "abcde";
    25. char s2[] = "bcdea";
    26. int flag = isLeftMove(s1, s2);
    27. printf("%d", flag);
    28. return 0;
    29. }

     运行结果如下: 

    •  第二种:拼接比较法

    1. //第二种方法:拼接比较法
    2. int isLeftMovePlus(char* s1, char* s2) {
    3. size_t lens1 = strlen(s1);
    4. size_t lens2 = strlen(s2);
    5. if (lens1 != lens2)
    6. return 0;
    7. char* start = strncat(s1, s1, lens1);
    8. //用strstr()函数判断s2是不是s1的子串
    9. if (strstr(start, s2) == NULL)
    10. return 0;
    11. else
    12. return 1;
    13. }
    14. int main() {
    15. char s1[20] = "abcde";
    16. char s2[] = "bcdea";
    17. int flag = isLeftMove(s1, s2);
    18. printf("%d", flag);
    19. return 0;
    20. }

      运行结果如下: 

  • 相关阅读:
    Spark简单介绍,Windows下安装Scala+Hadoop+Spark运行环境,集成到IDEA中
    【OpenCV 例程 300篇】248. 特征描述之HOG描述符
    缓慢变化维度SCD
    力扣-删除有序数组中的重复项-Java
    点击按钮 无法弹出另外一个界面,如何解决?
    【git】git配置自带的查看分支log图
    CPU乱序执行基础 —— Tomasulo算法及执行过程
    新手下白对Latex下手啦!
    Node.js 教程(3)【文末送惊喜】
    osgeo.gdal.Driver如何检查是否支持某一操作support
  • 原文地址:https://blog.csdn.net/ANNE_fly/article/details/133812007