Leetcode14:最长公共前缀【c语言实现】

在这里插入图片描述

  • 写这个题的时候遇到了挺多的问题
  • 首先就是拿到这个题的时候就看不懂的函数的参数了
    在这里插入图片描述
    就像是这样,char ** ????黑人问号,然后就去查资料补了一下知识漏洞。整理了一篇博客。各位有必要的话可以看一下。浅谈 Char、Char*、Char** 、Char a[]、Char *a[]
  • 接下来的问题就是思路的展开了,
  • 拿到这个题的时候,去搞明白了这个char** 的意思,emm其实也不是很明白,要不然也不会做这么久了。一直通过间接操作符* 去操作这个二级指针发现,真的是很麻烦,后面才想起来用数组的方式操作这个二级指针。
  • 首先做这个题的时候,我个人先想的是如何在一个 循环的条件下搞定这个东西,然后就一个码了三个多小时,最终也为如愿以偿,我当时的想法是,判断第i个元素与第i+1个的第j个字符是否相等,当它们相等并且此时已经判断到最后一个字符串的时候,就把它拿出来 ,放到一个数组里面去。然后最后的数组的地址返回出去。
  • 因为我当时第一次是用指针做的嘛,就很乱各种 *s++,*j++的。while(*s),就比较乱,然后捣鼓了好久也没弄出来。
  • 接下来想到的是,拿到这个字符串组中最短的那个字符串和它的长度吗,然后有个函数可以判断a与b字符串前n为位是否一样,然后用最短的去匹配其余的字符串嘛,因为最长的前缀最长也不超过最短字符串的长度。我当时就很开心,emmm。后面也发现还是徒劳。
  • 其实基于上一步,我应该想到一个很关键的原理 就是 短板效应
  • 具体是这样,我们首先去拿第一个字符串的第一个字符,(前提是它存在,即在之前应该做好为空的判断),然后就去for循环去匹配它与之后的字符串的第一个字符是否相同,只要有一个不同,就直接return,因为每个字符串的第一个字符都不同的话,肯定就不存在公共前缀了。
            if (tmp != strs[i][j]) {
                is_out = 0;
                break;
            }
  • 如果这一轮是相同的,即把这个字符存进我们的结果指针空间中,就好了,当然一层循环显示是控制不了的,因为存在第i个函数的第j个字符串的两个递进的条件,个人目前确实没有能力一层循环解决,不得不屈服了。时间复杂度 n方,想想那个曲线,就害怕
    char *result = (char *)malloc(1024);
    memset(result,'\0',1024);
  • 还有一些其他的处理,就是那个之前没想到用 malloc函数去分配指针的空间,这样就可以直接得到连续的存储空间来存放字符,之前还是先放在数组里面,然后在拿给一直指针变量,return出去。好像就这样了。贴代码了

longest-common-prefix.c

/**
  * -*- coding: utf-8 -*-
  *  @Time    : 2019/8/6 22:28
  *  @Author  : 奥利波德
  *  @FileName: longest-common-prefix.c
  *  @Software: CLion
  *  @Blog    :https://blog.csdn.net/qq_44265507
 */
#include <stdio.h>
#include <string.h>
char * longestCommonPrefix(char ** strs, int strsSize){
    int top = 0,is_out = 1;
    /**
     *  分配空间,并以'\0't填充
     * */
    char *result = (char *)malloc(1024);
    memset(result,'\0',1024);

    // 如果为空,则直接return
    if (strs == NULL || strsSize == 0)
        return result;

    /**
     * 两层for循环 我最终还是屈服于 O(n^2)了
     * tmp 是存储当前判断的这个字符的,从第一个字符串的第一个字符开始
     * 短板效应
     * */
    for (int j = 0; is_out; ++j) {
        char tmp = strs[0][j];
        for (int i = 1; i < strsSize; ++i) {
            if (tmp != strs[i][j]) {
                is_out = 0;
                break;
            }
        }
        if (tmp == '\0') break;
        if(is_out) result[top++] = tmp;
    }

    result[top] = '\0';
    return result;

}

int main(){
    char *a[]={"","",""} ;
    char **s=a;
    char *result = longestCommonPrefix(s,3);
    printf("%s",result);
    return 0;
}

在这里插入图片描述
哈哈哈哈。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值