字符串之(2)旋转词

题目:

  • 判断两个字符串是否互为旋转词

描述:
如果一个字符串str, 把字符串str前面任意一部分移到后面的而形成的新字符串叫做str的旋转字符串。比例str=“1234”, 那么他的旋转字符串有“2341”、“3412”、“4123”。现给定两个字符串str1和str2,判断这两个字符串是否互为旋转字符串。

要求:
如果这两个字符串长度互不相同,那么这两个字符串肯定不是旋转字符串;如果两个字符串长度相同,为n, 那么要求算法的时间复杂度为O(n)。

思路:

  • 如果两个字符串的长度不相同,直接返回false;
  • 如果长度相同,那么只需要将其中一个字符串进行拼接,然后判断这个新的大字符串中是否 包含另一个字符串,如果包含则两个互为旋转词;否则不是旋转词;
  • 例如str1=“123”, str2=“234”, 选择str1字符串进行拼接,生成新的字符串str_new=“123123”, 然后判断str_new中是否包含str2即可。

代码实现

函数实现使用了多个库函数,这个在面试过程中一般是不允许的。

  1. 字符串的拼接
  2. 在大字符串中寻找小字符串,这个可以是使用KMP算法实现。
int isRotation(const char *str1, const char *str2)
{
	
	char *str_new = NULL;
	int ret = 0, len = 0;
	if(!str1 || !str2 || strlen(str1)!=strlen(str2)){
		return FALSE;
	}
	len = strlen(str1)*2;

	str_new = (char *)malloc(len); /*无法确定字符串的长度*/
	if(!str_new){
		printf("malloc error\n");
		return FALSE;
	}
	memset(str_new, 0 ,len);
	sprintf(str_new, "%s%s", str1, str1);

	if(strstr(str_new, str2)){
		ret = TRUE;
	}else{
		ret =  FALSE;
	}
	free(str_new);
	return ret;
/* 使用KMP算法进行字符串的找到
	ret = kmpindex(str_new, str2, 0);
	if(ret>0){
		return TRUE;			
	}else{
		return FALSE;
	}
*/
} 	
发布了81 篇原创文章 · 获赞 69 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/s2603898260/article/details/103748916