文章目录
前言
题目:编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
要想解决本题,首先得知道指针数组的概念是什么。本文是用横向扫描方法解决,算法的思路在代码的注释里面。
一、示例:
二、代码
1.前期工作:引入指针数组概念
指针数组简单来说就是有一个数组,这个数组是由很多个指针组成的。
①数组的每一个元素都是指针(数组)。
②力扣那一题为什么要传进来一个二级指针?是因为指针数组是一个二级指针,参数传进来的时候,要用到**才能传进来。
代码如下(示例):
#include <stdio.h>
#include <malloc.h>
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.最长公共前缀
代码如下(示例):
/* 方法:横向扫描 */
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];
}
结果如图所示:
总结
横向扫描方法可以参考力扣官方解法:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode-solution/。