leetcoed 14. 最长公共前缀 练习

题目:

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

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

示例 1:

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

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

提示:

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

c代码:

int commonPrefixLength(char* s1, char* s2) {
    int i = 0;
    while (s1[i] != '\0' && s2[i] != '\0' && s1[i] == s2[i]) {
        i++;
    }
    return i;
}

char* longestCommonPrefix(char** strs, int strsSize) {
    if (strsSize == 0) return "";
    if (strsSize == 1) return strs[0];

    // 取第一个字符串作为初始的公共前缀
    char* prefix = strs[0];
    int prefixLength = strlen(prefix);

    for (int i = 1; i < strsSize; i++) {
        // 计算当前字符串与公共前缀的公共前缀长度
        int length = commonPrefixLength(prefix, strs[i]);
        // 更新公共前缀长度
        prefixLength = (length < prefixLength) ? length : prefixLength;
        // 如果公共前缀长度为0,直接返回空字符串
        if (prefixLength == 0) {
            return "";
        }
    }

    // 根据公共前缀长度创建结果字符串
    char* result = (char*)malloc(prefixLength + 1);
    strncpy(result, prefix, prefixLength);
    result[prefixLength] = '\0'; // 确保字符串以空字符结尾

    return result;
}

解析:

1.辅助函数 commonPrefixLength:
  • 这个函数接受两个字符串 s1 和 s2 作为参数。
  • 它通过一个循环来比较两个字符串从开始到它们不再相同的位置。
  • i 是一个计数器,用来记录公共前缀的长度。
  • 循环条件是 s1[i] 和 s2[i] 都不为字符串结束符 '\0' 且它们相等。
  • 一旦 s1[i] 和 s2[i] 不再相等或任一字符串结束,循环结束,返回 i 作为公共前缀的长度。
2.主函数 longestCommonPrefix:
  • 这个函数接受一个字符串数组 strs 和数组的大小 strsSize。
  • 如果数组大小为0,即没有字符串,函数返回空字符串 ""。
  • 如果数组大小为1,即只有一个字符串,直接返回这个字符串,因为它是唯一的公共前缀。
3.初始化公共前缀:
  • 将数组中的第一个字符串作为初始的公共前缀 prefix。
  • 计算这个字符串的长度 prefixLength。
4.循环遍历字符串数组:
  • 从第二个字符串开始,使用 commonPrefixLength 函数计算它与当前公共前缀的公共前缀长度。
  • 使用 length < prefixLength 来更新公共前缀的长度,取两者中的较小值。
  • 如果在任何时候公共前缀的长度变为0,说明没有公共前缀,函数返回空字符串 ""。
5.创建结果字符串:
  • 使用 malloc 分配足够的内存来存储最长公共前缀。
  • 使用 strncpy 函数将公共前缀复制到新分配的内存中,直到 prefixLength 个字符。
  • 确保新字符串以空字符 '\0' 结尾,这样它就是一个有效的C语言字符串。
6.返回结果:
  • 返回包含最长公共前缀的新字符串。
7.内存管理:
  • 由于使用了动态内存分配,调用者需要负责释放返回的字符串以避免内存泄漏。

笔记:
 

字符串数组:strs []= ["flower","flow","flight"], strs[0]是字符串"flower"中首元素的地址

二级指针:一个指针变量,它又存储了另一个指针变量的地址时,这就是一个二级指针。该案例中使用了一个二级指针  char** strs,用来索引字符串数组strs

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值