【C语言】两个字符串的相似度检查
前言
在编程中,我们经常需要判断一个字符串是否是另一个字符串旋转后的结果。所谓字符串旋转,就是将字符串的前若干个字符移到字符串的末尾。例如:
-
"AABCD" 左旋一个字符得到 "ABCDA"
-
"AABCD" 左旋两个字符得到 "BCDAA"
-
"AABCD" 右旋一个字符得到 "DAABC"
目录
前言
代码思路分析
核心算法
代码亮点
代码实现细节
算法复杂度分析
改进建议
总结
代码思路分析
核心算法
这个C语言程序实现了一个rotation
函数,通过生成所有可能的左旋转字符串并与原字符串比较来判断是否为旋转关系。
主要思路:
-
遍历字符串s2的所有可能的左旋位置(0到4)
-
对于每个旋转位置k,生成旋转后的字符串s3
-
将s3与s1逐字符比较
-
发现匹配立即返回1,否则在所有旋转尝试后返回0
代码亮点
-
完整的测试流程:程序提供了完整的主函数,包含输入、输出和函数调用
-
清晰的比较逻辑:通过计数方式判断两个字符串是否完全匹配
-
可视化调试:在旋转过程中打印每个生成的旋转字符串,便于理解算法过程
代码实现细节
c
int rotation(char s1[], char s2[], char s3[])
{int j = 0, m = 0, k = 0, flag = 0;int count = 0;char* p = s2;// 尝试所有可能的左旋位置for(; k < 5; k++){p = s2;count = 0;// 生成旋转后的字符串for(j = 0; j < 5 - k; j++){s3[j] = s2[k + j];}for(m = j; m < 5; m++){s3[m] = *p;p++;}// 打印当前旋转结果(调试用)for(int i = 0; i < 5; i++){printf("%c", s3[i]);}// 比较旋转结果与原字符串for(int i = 0; i < 5; i++){if(s1[i] == s3[i])count++;}// 如果完全匹配,返回1if(count == 5){flag = 1;return 1;}printf("\n");}// 所有旋转尝试失败,返回0if(k == 5 && flag == 0)return 0;
}
算法复杂度分析
-
时间复杂度:O(n²),其中n是字符串长度
-
空间复杂度:O(n),需要额外的s3数组存储旋转结果
改进建议
虽然当前实现能够正确解决问题,但还有优化空间:
-
字符串长度处理:代码中硬编码了字符串长度为5,应该改为动态获取字符串长度
-
边界情况处理:添加对空字符串和长度不匹配的检查
-
算法优化:可以使用字符串拼接技巧,将s2与自身拼接,然后检查s1是否是拼接后字符串的子串
c
// 优化思路示例
int isRotationOptimized(char* s1, char* s2)
{if(strlen(s1) != strlen(s2)) return 0;char temp[2 * strlen(s1) + 1];strcpy(temp, s2);strcat(temp, s2);return strstr(temp, s1) != NULL;
}
总结
这个C语言程序展示了解决字符串旋转判断问题的基本思路,通过生成所有可能的旋转字符串并进行比较,虽然效率不是最优,但思路清晰,适合初学者理解问题本质。在实际应用中,可以根据性能需求选择更优化的算法实现。