C语言编程题——字符串旋转结果

题目内容

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

例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC

解题思路

方法1

把s1每旋转一个字符就和s2比较一下看是否相等,把所有旋转的可能性都和s2比较,两个字符串有多少个字符就旋转多少次后比较。
如:

abcdef
bcdefa
cdefab
defabc
efabcd
fabcde

最多转六次,再旋转就要转回去了。

代码实现

#include 
#include 

void reverse(char* left,char* right)
{
        while(left < right)
        {
                char t = *left;
                *left = *right;
                *right = t;

                left++ ;
                right--;
        }
}
void left_move(char* arr,int k)
{
       int len = strlen(arr) - 1;
        
       reverse(arr,arr + k -1);//逆序左边,从a - b
       reverse(arr + k,arr + len);//逆序右边,从c - f
       reverse(arr,arr + len);//逆序整体
}
                                        

int is_left_move(char* s1,char*s2)
{
	int len = strlen(s1);//判断旋转多少次
	int i;
	for(i = 0;i < len;i++)
	{
		left_move(s1,1);
		if(!strcmp(s1,s2))
		{
			return 1;
		}		
	}
	return 0;	
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "cdrfab";

	if(1 == is_left_move(arr1,arr2))
	{
		printf("是转转\n");
	}
	else
	{
		printf("不转转\n");
	}
	
	return 0;
}

方法2

1、将s1的字符串复制一个接到s1后面,这样一串字符就包括了将s1旋转之后的所有可能性。
2、判断s2指向的字符串是否是s1s1的子串

abcdef//s1
abcdefabcdef//s1s1
  cdefab//s2

代码实现

#include 
#include 
#define MAX 30

int is_left_move(char* s1,char*s2)
{
		//1.在s1字符串后连接一个s1
		 strncat(s1,s1,strlen(s1));//此处不能用strcat
		//2.判断s2指向的字符串是否是s1指向的字符串的子串
        //strstr函数—— 找子串的函数
		if(NULL == strstr(s1,s2))//在s1里面找找有没有包含s2的子串,没有找到则返回空指针
        {
                return 0;
        }
        else
        {
                return 1;
        }
}

int main()
{
        char arr1[MAX] = "abcdef";//注意字符串越界
        char arr2[] = "cdefab";

        if(1 == is_left_move(arr1,arr2))
        {
                printf("是转转\n");
        }
        else
        {
                printf("不转转\n");
        }


        return 0;
}

隐藏问题
如果s2是cdef,显然不是s1旋转得来的,但是依然能在连接串中的子串中找到cdef。

abcdefabcdef//s1s1
  cdef//s2

解决方法
在自定义函数的开头就先判断两个字符串是否一样长,长度不一样直接扔个0回去。

		if(strlen(s1) != strlen(s2))
 		{
                return 0;
        }

你可能感兴趣的:(c语言,算法,数据结构)