其他分享
首页 > 其他分享> > 字符串左旋问题及判断一个字符串是否由另一个字符串左旋得到

字符串左旋问题及判断一个字符串是否由另一个字符串左旋得到

作者:互联网

字符串左旋问题

问题描述

左旋字符串中的k个字符。例如 ABCD左旋一个字符得到BCDA ,ABCD左旋两个字符得到CDAB

解法一:暴力破解法

解法二:三部翻转法

#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* low, char* high)
{
	assert(low != NULL);
	assert(high != NULL);
	while (low < high)
	{
		char temp = *low;
		*low = *high;
		*high = temp;
		low++;
		high--;
	}
}
void move_left(char* arr, int k)
{
	//指针指向非空
	assert(arr != NULL);
	int sz = strlen(arr);
	assert(k <= sz);
	reverse(arr,arr+k-1);//左边逆序
	reverse(arr+k, arr +sz-1);//右边逆序
	reverse(arr, arr + sz - 1);//整体逆序
}
int main()
{
	char  arr[] = "abcdef";
	int k = 3;
	move_left(arr, k);
	printf("%s", arr);
}

补充扩展

判断一个字符串是否是由另一个字符串左旋得到

eg:str1=“abcdef”,

str2=“cdefab”,

str1是由str2左旋得到的

解法一:穷举法

将字符串2左旋k个字符与字符串1进行比较,使用strcmp函数如果相等则返回yes,反之返回no

#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* low, char* high)
{
	assert(low != NULL);
	assert(high != NULL);
	while (low < high)
	{
		char temp = *low;
		*low = *high;
		*high = temp;
		low++;
		high--;
	}
}
void move_left(char* arr, int k)
{
	//指针指向非空
	assert(arr != NULL);
	int sz = strlen(arr);
	assert(k <= sz);
	reverse(arr, arr + k - 1);//左边逆序
	reverse(arr + k, arr + sz - 1);//右边逆序
	reverse(arr, arr + sz - 1);//整体逆序
}
int is_left_move(char* s1, char* s2)
{
	int sz = strlen(s1);
	for (int k = 0; k < sz ; k++)
	{
		move_left(s2, 1);
		int ret=strcmp(s1, s2);
		if (ret == 0)
			return 1;
	}
	return 0;
}
int main()
{
	char  arr1[] = "abcdef";
	char arr2[] = "cdefjab";
	int ret=is_left_move(arr1, arr2);
	if(ret==1)
    {
         printf("yes");
    }
    else
    {
        printf("no");
    }
}

解法二:判断子串法

标签:arr,判断,int,str1,char,include,字符串,左旋
来源: https://blog.csdn.net/qq_45767476/article/details/115438308