请设计一个线性时间的算法,判断字符串 S 是否是另一个字符串 S’ 的循环旋 转。例如, arc 和 car 是彼此的循环旋转C语言
时间: 2024-11-06 20:21:14 浏览: 17
为了判断字符串 S 是否是另一个字符串 S' 的循环旋转,你可以使用双指针技巧,这种方法的时间复杂度可以达到 O(n),其中 n 是字符串的长度。以下是 C 语言的一个简单示例算法:
```c
#include <stdbool.h>
#include <string.h>
bool isRotation(char *S, char *S') {
// 首先检查两个字符串的长度是否相等
if (strlen(S) != strlen(S')) {
return false;
}
// 将原字符串 S 连接到自身形成一个新的字符串 T
char T[strlen(S) * 2];
strcpy(T, S);
strcat(T, S);
// 使用双指针法,一个指向 T 的起始位置,另一个从头开始
int left = 0;
int right = strlen(S) - 1;
while (right < strlen(T) - 1) {
// 如果当前字符组合和 S' 相同,移动左指针
if (T[left] == S'[0] && T[right] == S'[strlen(S) - 1]) {
bool isMatch = true;
for (int i = 1; i < strlen(S); ++i) {
if (T[left + i] != S'[i]) {
isMatch = false;
break;
}
}
if (isMatch) {
return true;
}
left++;
} else {
right++;
}
}
// 没有找到匹配,说明不是循环旋转
return false;
}
// 示例
int main() {
char S[] = "arc";
char S'[] = "car";
if (isRotation(S, S')) {
printf("'%s' 是 '%s' 的循环旋转\n", S, S');
} else {
printf("'%s' 不是 '%s' 的循环旋转\n", S, S');
}
return 0;
}
```
阅读全文