在C语言中,求两个字符串的最长公共子串是一个经典的问题,它涉及到字符串处理和算法。最长公共子串是指在两个或多个字符串中都存在的、且长度最长的连续字符序列。这个问题在文本处理、数据比较和生物信息学等领域都有广泛的应用。
我们需要了解C语言中的字符串处理基础。在C语言中,字符串是以null字符('\0')结尾的字符数组。例如,字符串"hello"在内存中存储为{'h', 'e', 'l', 'l', 'o', '\0'}。我们通常使用`char`数组来表示字符串,并使用`strlen()`函数来计算字符串的长度。
在提供的代码中,定义了以下几个函数:
1. `stringLength(char * str)`:这是一个辅助函数,用于计算传入的字符串的长度。通过遍历字符串直到遇到null字符为止,累加计数器`len`,最后返回这个长度。
2. `getCommon(char str1[], char str2[], char * str3)`:这是解决最长公共子串问题的主要函数。它的输入是两个待比较的字符串`str1`和`str2`,以及一个结果字符串`str3`,用于存放找到的最长公共子串。
函数`getCommon`的工作原理是使用两个嵌套循环遍历`str1`和`str2`的所有可能的子串对,然后逐个字符比较这些子串。当找到匹配的字符时,继续比较后面的字符,直到遇到不匹配的字符或者到达字符串的末尾。如果当前子串的长度大于之前找到的最长子串,更新最长子串的长度`max`和起始位置`start`。
在内部的嵌套循环中,`k`作为当前子串的长度被累加,直到遇到不匹配的字符或者子串结束。`if(max < k)`用于检查是否找到了更长的公共子串,如果是,则更新`max`和`start`。
如果`start`仍然是-1,这意味着没有找到公共子串,那么将`str3`的第一个字符设置为null字符。否则,使用`memcpy()`函数将最长公共子串从`str1`复制到`str3`,并添加null字符作为结束符。
在`main()`函数中,用户可以输入两个字符串,然后调用`getCommon()`函数获取它们的最长公共子串,并将其打印出来。注意,这段代码中使用了`gets()`函数,它是不安全的,因为它可能导致缓冲区溢出。在实际编程中,应使用`fgets()`替代,以确保安全性。
总结来说,C语言求两个字符串的最长公共子串主要依赖于字符串操作和动态查找算法。通过逐字符比较和记录最长匹配长度,我们可以找到这两个字符串的最长公共部分。这段代码提供了一个直观的实现方法,但它还可以进一步优化,例如使用更高效的算法,如动态规划,以降低时间复杂度。