字符串移位包含的问题

在下面的算法中会用到strstr函数,在C语言里有这个函数的介绍。

  • 思路一

    找出字符串s1所有循环移位得到的字符串,看是否有字符串包含s2

void rotate(char * s)
{
	int len=strlen(s);
	char temp=s[0];
	for(int j = 0;j<len-1;j++)
	{
		s[j]=s[j+1];
	}
	s[j]=temp;
	printf("%s\n",s);

}

bool exists(char *s1, char *s2)
{
	int len = strlen(s1);
	
	//做len-1次移位,最后回到原来的数据
	for(int i = 0;i<len;i++)
	{
		rotate(s1);
		if(strstr(s1,s2))
			return true;
	}
	return false;
}

如果字符串s1很长,那么该算法效率很低


  • 思路二

    如果字符串为s1,那么s1s1肯定包含了所有s1循环移位的字符串。

    例如ABCD->BCDA->CDAB->DABC为所有ABCD循环移位的字符串

    ABCDABCD显然包括了以上所有的字符串

    那么我们只需得到s1s1,只使用一次strstr函数便可解出

    看代码

bool exists(char *s1, char *s2)
{
	char * temp1 = s1;
	int len = strlen(s1);
	char * const s = (char *)malloc(sizeof(char)*(2*len+1));
	char * temp2 = (char *)s;

	//以下生成s1s1字符串
	while(*temp1)
		(*temp2++)=(*temp1++);
	temp1=s1;
	while((*temp2++) =(*temp1++));

	bool exist = strstr(s,s2);

	free(s);

	return exist;
}

该算法大大降低了时间复杂的,但是空间复杂度却提高了,如果字符串很长很长,会占用很大的空间。



参考书籍:《编程之美》

转载于:https://my.oschina.net/u/1469592/blog/268259

O1709字符串移位包含问题是给定两个字符串s1和s2,要判断s2是否可以通过对s1进行循环移位得到的字符串包含。根据给出的引用内容,可以有以下方法来解决这个问题: 1. 使用最直接的方法:对s1进行循环移位,并判断移位后的字符串是否包含s2。 2. 使用空间换时间的方法:将s1的所有循环移位得到的字符串保存在一个集合中,然后判断s2是否在这个集合中。 根据题目描述,输入是两个字符串,中间由单个空格隔开,字符串包含字母和数字,长度不超过30。输出是一个布尔值,表示是否可以通过循环移位得到的字符串包含。例如,对于输入"AABCD CDAA",输出为true。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [字符串移位包含问题](https://blog.csdn.net/li1914309758/article/details/82192743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [[补档][C++习题]字符串移位包含问题](https://blog.csdn.net/LQL_114514/article/details/130785813)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值