【LeeCode】- 最长公公前缀

题目

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

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

示例 1:

1
2
输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

1
2
3
4
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:

所有输入只包含小写字母 a-z 。

解法

解法一:水平扫描法

首先,我们将描述一种查询一组字符串的最长公共前缀 LCP(S1...Sn),我们得到结论是:

LCP(S1...Sn)=LCP(LCP(LCP(S1,S2),S3),...Sn)

从公式可以看出,两两比较的字符串的公共字符串就是我们的运算过程。

水平扫描法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *longestCommonPrefix(char **strs, int strSize)
{
int i, j;

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

char *str = (char *)malloc(sizeof(char) * 1000);

strcpy(str, strs[0]);

for (i = 1; i < strSize; i++)
{
j = 0;
while (str[j] && strs[i][j] && str[j] == strs[i][j])
{
j++;
}
str[j] = '\0';
}

return str;
}

int main()
{
char *strs[] = {"lees", "leetcode", "leet", "leets"};

int size = sizeof(strs) / sizeof(char *);

char *lcp;

lcp = longestCommonPrefix(strs, size);

printf("%s\n", lcp);

return 0;
}

具体请查看我的 github 仓库项目

leetcode-practice