字符串之(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即可。
代码实现
函数实现使用了多个库函数,这个在面试过程中一般是不允许的。
- 字符串的拼接
- 在大字符串中寻找小字符串,这个可以是使用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;
}
*/
}