编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
说明:
所有输入只包含小写字母 a-z 。
题解:
1,以数组的第一个字符串为标杆,依次循环取出第一个字符串的前缀字符串
2,从数组的第二个字符串开始和第一个取出来的前缀字符串进行比较
3,用一个变量保存符合公共字符串的长度
注意:在循环比较中,要注意数组溢出的情况。另外假如取出来的前缀字符串比中间的某个字符串长度还大,则没有继续匹配下去的必要了,跳出循环
知识点:
C 库函数 int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。
参数:
- str1 -- 要进行比较的第一个字符串。
- str2 -- 要进行比较的第二个字符串。
- n -- 要比较的最大字符数。
返回值
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str2 小于 str1。
- 如果返回值 = 0,则表示 str1 等于 str2。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *longestCommmonPrefix(char **strs,int strSize)
{
int i,j;
int flag = 0,max=0;
for(i=1; i<=strlen(*strs) && flag!=2; i++)
{
flag = 0;
for(j=1; j<strSize; j++)
{
if(i<=strlen(strs[j]) && strncmp(*strs,strs[j],i) != 0)
{
flag = 1;
break;
}
if(i>strlen(strs[j]))
{
flag = 2;
break;
}
}
if(flag == 0)
max = i;
}
char *result = (char *)malloc((max+1)*sizeof(char));
memset(result,0,max+1);
memcpy(result,strs[0],max);
return result;
}
int main()
{
/*
example 1: char *strs[3]= {"flowers","flow","flight"};
example 2: char *strs[3]= {"dog","racecar","car"};
*/
char *strs[3]= {"flowers","flow","flight"};
char *prefix = longestCommmonPrefix(strs,3);
printf("%s\n",prefix);
free(prefix);
prefix = NULL;
return 0;
}