流心
发布于 2024-05-23 / 1 阅读
0

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入:strs = ["flower","flow","flight"] 输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。

char* longestCommonPrefix(char** strs, int strsSize) {
    if (strsSize == 0){
        return "";
    }
    int i,j ;
    for(i = 0;i < strlen(strs[0]);++i){
        for(j = 1;j < strsSize;++j){
            if (strs[0][i] != strs[j][i])
		{
			strs[0][i] = '\0';
			return strs[0];
            }
        }
    }
    return strs[0];
}
  • 这个函数接受两个参数:strs 是一个指向字符串指针的指针(字符串数组),strsSize 是数组的大小。函数返回一个字符指针,表示最长公共前缀。

if (strsSize == 0) { return ""; }

  • 首先,函数检查字符串数组是否为空。如果 strsSize 为 0,表示没有字符串,则返回空字符串。

int i, j;

  • 声明两个整型变量 ij,用来作为循环索引。

for(i = 0; i < strlen(strs[0]); ++i) {

  • 外层循环,遍历第一个字符串 strs[0] 的每一个字符。i 表示字符的索引。

for(j = 1; j < strsSize; ++j) {

  • 内层循环,从第二个字符串开始,检查每个字符串在当前索引 i 处的字符是否与第一个字符串相同。

if (strs[0][i] != strs[j][i]) {

  • 如果发现任意一个字符串的第 i 个字符与第一个字符串的第 i 个字符不相同,进入条件判断。

strs[0][i] = '\0'; return strs[0];

  • 将第一个字符串的第 i 个字符置为 '\0'(结束符),这意味着从此位置起,公共前缀结束,然后返回修改后的第一个字符串。

} }

  • 内层循环结束,表示所有字符串在前 i 个字符处相同,继续检查下一个字符。

return strs[0]; }

  • 如果外层循环完成而没有发现不同的字符,则返回第一个字符串 strs[0],它就是所有字符串的最长公共前缀。

总结

这个函数的核心逻辑是利用两个嵌套的循环来比较第一个字符串的每个字符与其他所有字符串对应位置的字符。如果发现有任何不匹配,便将第一个字符串的当前字符设置为结束符 '\0',并返回此时的第一个字符串。最后,如果所有字符都匹配,函数返回整个第一个字符串作为公共前缀。

注意事项

  1. 性能问题:这个实现的时间复杂度是 O(n * m),其中 n 是字符串的个数,m 是第一个字符串的长度。如果字符串数组很大或字符串很长,性能可能会受到影响。

  2. 返回值:函数返回的是修改后的第一个字符串的指针,而不是一个新的字符串,这可能会导致原始字符串被意外修改。