编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
C代码①
char* longestCommonPrefix(char** strs, int strsSize) {
int i, j=0,k=0, flag=0;
char *result = (char*)malloc(sizeof(char*)*1000); //公共前缀字符串
if(strsSize <= 0) //空字符串数组或无效strsSize输入
return "";
if(strsSize == 1) //数组中只有一个字符串,前缀为本身
return strs[0];
for(i=1; i<strsSize; i++) //数组中任一字符串为空,则无公共前缀
{
if(strs[i] == NULL)
return "";
}
while(true)
{
for(i=1; i<strsSize; i++)
{
//循环查找结束条件:
//a.任一字符串遍历完(以最短字符串为基准)
//b.出现各字符串的非公共前缀(以第一个字符串为基准)
if(strs[0][j]=='\0' || strs[i][j]=='\0' || strs[0][j]!=strs[i][j])
{
flag=1;
break;
}
}
if(flag == 1)
break;
if(strs[0][j] == '\0')
break;
result[k++] = strs[0][j]; //组成公共前缀
j++; //注意i与j的层次关系(依次比较各个字符串的元素)
}
result[k] = '\0'; //添加结束符以构成公共前缀字符串
return result;
}
C代码②
//先求公共前缀长度,再构造公共前缀字符串
char* longestCommonPrefix(char** strs, int strsSize) {
int i=0,j=0;
if(strsSize==1)
return strs[0];
while(1)
{
i=0;
while(i<strsSize-1) //while中涉及i+1,故i<strsSize-1
{
if(strs[i][j]==strs[i+1][j] && strs[i][j]!='\0' && strs[i+1][j]!='\0')
++i;
else
break;
}
if(i==strsSize-1) //数组中的字符串都存在j+1位的公共前缀
++j;
else
break;
}
char*a=(char*)malloc(sizeof(char)*(j+1)); //按公共前缀分配空间
a[j]='\0';
i=0;
while(i<j) //构造公共前缀
{
a[i]=strs[0][i];
++i;
}
return a;
}
总结:代码①和②在空间分配的区别,字符串数组(二维数组)strs[i][j]在比较时i和j的层次关系