C语言:判断一个字符串是否为另外一个字符串旋转之后的字符串。(左旋右旋、求子串)

原创 2016年05月30日 17:14:38

法1:

    判断是否是其左旋再判断是否是右旋。



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Reverse(char* left, char* right)
{
    while (left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }

}


char* Left_Reverse(char* arr, int k, int len)//接收,否则无法将变化的字符串和arr2比较
{
    char* cur = arr;
    Reverse(arr, arr + k - 1);
    Reverse(arr + k, arr + len - 1);
    Reverse(arr, arr + len - 1);
    return cur;
}


char* Right_Reverse(char* arr, int k, int len)//接收
{
    char* cur = arr;
    Reverse(arr, arr + len - k - 1);
    Reverse(arr + len - k, arr + len - 1);
    Reverse(arr, arr + len - 1);
    return cur;
}


int main()
{
    char arr1[] = "AABCD";
    char arr2[] = "CDAAB";

    int len = strlen(arr1);
    int k = 0;

    //判断是否左旋得到
    for (k = 0; k < len; k++)
    {
        char* ret1 = Left_Reverse(arr1, k, len);
        if (strcmp(ret1, arr2) == 0)
        {
            printf("左旋\n");
            break;
        }
    }

    //判断是否右旋得到
    char _arr1[] = "AABCD";  //之前的arr1经过左旋后已经发生了改变
    k = strlen(arr1);  //k = len主要想从不旋转开始比较字符串
    char* ret2 = NULL;
    while (k > 0)
    {
        ret2 = Right_Reverse(_arr1, k, len);
        if (strcmp(ret2, arr2) == 0)
        {
            printf("右旋\n");
            break;
        }
        k--;
    }
    if ((k == 0) && (strcmp(ret2, arr2) != 0))
    {
        printf("既不是左旋又不是右旋\n");

    }
    system("pause");
    return 0;
}


法2:

    判断一个字符串是否是另一个字符串自身连接的子串。

    假设两个字符串分别为ABCD和DCBA,将第一个字符串“ABCD”连接成新的字符串“ABCDABCD”。再比较新的字符串"ABCDABCD“与字符串”DCBA“,判断字符串”DCBA“是不是另一个字符串的子串。如果是,则说明是旋转字符串。



#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>


char* my_strncat(char* dest, char* src, int size)
{
    assert(dest);
    assert(src);
    char* tmp = dest;
    while (*dest)
    {
        dest++;        
    }

    while (size)
    {
        *dest++ = *src++;    
        size--;
    }    
    *dest = '\0';
    return tmp;
}


int main()
{
    char arr1[15] = "AABCD";
    char arr2[] = "BCDAA";
    int len = strlen(arr1);
    char* ret1 = my_strncat(arr1, arr1, len);//ret1是arr1自己连接自己后的字符串

    char* ret2 = strstr(ret1, arr2);
    if (*ret2 == NULL)
    {
        printf("不是!");
    }
    else
    {
        printf("是!");
    }

    system("pause");
    return 0;
}

 

 

c语言----高位舍弃的左旋和右旋操作

#include //Perform left and right rotations unsigned char rol(unsigned char val) { int highbit; if...
  • NeQrhk
  • NeQrhk
  • 2016年11月16日 13:23
  • 297

字符串左旋右旋——三步旋转法和移相法

字符串左旋右旋——三步旋转法和移相法!(K个字符)

剑指offer之字符串左旋右旋问题

右旋 关于思路: 1.右旋就是把字符串的前几个字符放到字符串的后面,首先,可以根据要旋转的数量,把字符串分成两部分。 2.第一部分进行翻转,第二部分进行翻转。 3.整体翻转 例如:abcde...
  • yaszja
  • yaszja
  • 2017年08月08日 20:26
  • 100

面试热门题:字符串左旋右旋

面试的时候有很多这种左旋或者右旋的题目,今天我就把这个题目用不同的方式探讨一下 例题:请实现字符串右循环移位函数,比如:"abcdefg"循环右移3位就是"efgabcd"; 第一种方法:三目旋转法,...

判断一个字符串是否为另外一个字符串左旋或右旋之后的字符串。

#define _CRT_SECURE_NO_WARNINGS 1 #include #include #include #include void show(char arr[], int len)...

字符串左旋右旋--程序员面试宝典

一.左旋 解1 void left_move(char* msg, int len, int steps) { assert(msg); assert(len); steps = steps%l...

求一个字符串中连续出现的次数最多的子串[C语言实现]

#include #include #include #define MAX_SIZE 50 int find_con_sub(char *str, char **ret); int ma...
  • ryj111
  • ryj111
  • 2013年10月07日 15:45
  • 2816

平衡二叉树(AVL树)一图一步骤代码实现左旋右旋,左右平衡操作

/** * 类说明:AVL树 */ public class AVLTreeE extends ComparableE>> { NodeE> root; int size = ...

C语言 求一个字符串中最长回文子串的长度

问题描述:如题,给定一个字符串str和其长度n,求该字符串的一个最长公共回文子串的长度(公共子串个公共子序列是两个不同的概念)。并打印出该回文子串。 解答:1,首先给出一个比较直观的解法。根据回...

C语言之——左旋字符串

如:ABCDE左旋一位是BCDEA;左旋两位是CDEAB。 方法一:循环左移法。 先将第一次字符拿出,然后将后面的字符依次向左移1位,刚好最后一个字符空出,把第一个字符放入,当然这里面考虑到这个字符串...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言:判断一个字符串是否为另外一个字符串旋转之后的字符串。(左旋右旋、求子串)
举报原因:
原因补充:

(最多只允许输入30个字)