力扣每日一题——最长公共前缀

文章目录

  • 前言
  • 一、示例:
  • 二、代码
    • 1.前期工作:引入指针数组概念
    • 2.最长公共前缀
  • 总结


前言

题目:编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
要想解决本题,首先得知道指针数组的概念是什么。本文是用横向扫描方法解决,算法的思路在代码的注释里面。


一、示例:

力扣每日一题——最长公共前缀_第1张图片

二、代码

1.前期工作:引入指针数组概念

指针数组简单来说就是有一个数组,这个数组是由很多个指针组成的。
①数组的每一个元素都是指针(数组)。
②力扣那一题为什么要传进来一个二级指针?是因为指针数组是一个二级指针,参数传进来的时候,要用到**才能传进来。

代码如下(示例):

#include 
#include 

void print(char** strs, int n) {
	int i;
	for(i = 0; i < n; i++) {
		printf("%d : %s\n", i+1, strs[i]);
	}
}



//指针数组

int main(void) {
	char *strs[5] = {"flower", "flow", "fight"};
	strs[0] = "flower";

	print(strs, 3);
	return 0;
}


结果如图所示:

力扣每日一题——最长公共前缀_第2张图片

2.最长公共前缀

代码如下(示例):

/* 方法:横向扫描 */
char * longestCommonPrefix(char ** strs, int strsSize){
    if(0 == strsSize) {
        return NULL;
    } 
    if(1 == strsSize) {
        return strs[0];
    }

    int i, j;
    //遍历所有字符串数组,与第一个字符串数组进行比较
    for(i = 1; i < strsSize; i++) {
        //因为要与第一个字符串数组的内容比较,所以要求出第一个字符串数组的长度
        for(j = 0; j < strlen(strs[0]); j++) {
            //当其余的字符串数组与第一个字符串数组的内容进行比较,遇到不同内容时,就立刻截至公共前缀
            if( strs[0][j] != strs[i][j] ) {
                strs[0][j] = '\0';
                break;  //遇到不同内容时,立刻终止内循环
            }
        }

    }

    return strs[0];
}

结果如图所示:
力扣每日一题——最长公共前缀_第3张图片


总结

横向扫描方法可以参考力扣官方解法:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode-solution/。

你可能感兴趣的:(C语言,leetcode,算法,职场和发展,c语言)