字符串左旋与字符串旋转结果判断

1.字符串左旋

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

例如 ABCD左旋一个字符得到BCDA   ABCD左旋两个字符得到CDAB

#include <stdio.h>
void string_left_rotate(char* str, int k)
{
	int i = 0;
	int n = strle(str);
	for(i = 0;i<k;i++)
	{
		//每次左旋转一个字符
	    char tmp = *str;//1
		//2.把后面的n-1个字符往前挪动
		int j = 0;
		for(j = 0;j<n-1;j++)
		{
			*(str+j) = *(str+j+1);
		}
		//3.把tmp放在最后
		*(str+n-1) = tmp;
	}
}


int main()
{
	char arr[10] = "ABCDEF";
	int k = 2;
	string_left_rotate(arr,k);
	printf("%s\n",arr);
	
	return 0;
}

方法2:写一个逆序函数调用三次

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


void string_left_rotate(char* str, int k)
{    
     assert(str);

     int n = strlen(str);
	 reverse(str,str+k-1);//左 
	 reverse(str+k,str+n-1);//右 
	 reverse(str,str+n-1);//整体逆序 
}


int main()
{
	char arr[10] = "ABCDEF";
	int k = 2;
	string_left_rotate(arr,k);
	printf("%s\n",arr);
	
	return 0;
}

2.字符串旋转结果判断

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。列如给定S1 = AABCD和S2 = BDCAA,返回1。给定S1 = abcd和S2 = ABCD,返回0。

#include <stdio.h>
#include <string.h> 
int is_string_rotate(char*str1, char*str2)
{
	
 	int i = 0;
	int n = strle(str1);
	for(i = 0;i<n;i++)
	{
		//每次左旋转一个字符
	    char tmp = *str1;//1
		//2.把后面的n-1个字符往前挪动
		int j = 0;
		for(j = 0;j<n-1;j++)
		{
			*(str1+j) = *(str1+j+1);
		}
		//3.把tmp放在最后
		*(str1+n-1) = tmp;
		
		if(strcmp(str1,str2)==0)
		{
			return 1;
		}
	}
	return 0;
	
	
}

int main()
{
	char arr1[] = "AABCD";
	char arr2[] = "BCDAA";
	int ret = is_string_rotatr(arr1,arr2);
	if(ret==1)
	{
		printf("yes\n");
	}
	else
	{
		printf("no\n");
	}
	return 0;
}

每旋转一次判断一次

使用库函数法

#include <stdio.h>
#include <string.h> 
int is_string_rotate(char*str1, char*str2)
{   
    if(strlen(str1)!=strlen(str2))
    {
    	return 0;
	}
	//1.str1字符串后面追加一个str1
	//ABCDABCAD
	int len = strlen(str1);
	strncat(str1,str1,len); 
	//2.判断str2是否为str1的子串
    char* ret = strstr(str1,str2);
	//AABCDAACD
	//BCDAA
	if(ret = NULL)
	{
		return 0;
	}
	else
	{
		return 1;
	}
	//或者不用if 直接使用语句 return ret != NULL; 
	
}

int main()
{
	char arr1[20] = "AABCD";
	char arr2[] = "BCDAA";
	int ret = is_string_rotatr(arr1,arr2);
	if(ret==1)
	{
		printf("yes\n");
	}
	else
	{
		printf("no\n");
	}
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值