请用C语言设计一个线性时间的算法,判断字符串 S 是否是另一个字符串 S’ 的循环旋转。例如, arc 和 car 是彼此的循环旋转,给出具体代码示例
时间: 2024-11-06 09:20:21 浏览: 19
在C语言中,我们可以设计一个简单的线性时间复杂度O(n)的算法来判断两个字符串S和S'是否是对方的循环旋转。这个算法的基本思路是将S'拼接到S的末尾,然后检查生成的新字符串是否包含S。
```c
#include <stdbool.h>
#include <string.h>
bool is_rotation(char* S, char* S') {
if (strlen(S) != strlen(S')) {
return false; // 如果长度不同,则不是旋转
}
char combined[strlen(S) * 2];
strcpy(combined, S);
strcat(combined, S'); // 将S'拼接到S的末尾
int i = 0;
for (i = 0; i < strlen(combined); i++) {
if (combined[i] == S[0]) { // 如果找到S的第一个字符
if (strstr(combined + i, S)) { // 搜索剩余部分是否等于S
return true;
}
}
}
return false; // 未找到S,所以不是旋转
}
// 示例
int main() {
char S[] = "arc";
char S'[] = "car";
if (is_rotation(S, S')) {
printf("%s is a rotation of %s\n", S, S');
} else {
printf("%s is not a rotation of %s\n", S, S');
}
return 0;
}
```
在这个示例中,`is_rotation()`函数首先检查两个字符串的长度,如果长度不同则直接返回false。接着它创建一个新的字符串combined,然后从combined开始遍历,查找第一个字符S[0],再检查其后的子串是否等于S。如果找到了,就说明S是S'的循环旋转;如果没有找到,那就不是。
阅读全文