14. Longest Common Prefix
Difficulty: Easy
Write a function to find the longest common prefix string amongst an array of strings.
在给定字符串数组中找出所有字符串的最长公共前缀。
思路:
1.尽量减少字符比较的次数。
2.首先获取最短的字符串,该字符串作为最长公共前缀与其他字符串逐一进行比较,变量comlen标记最长公共前缀的长度。如果数组中的某个字符串长度为0,或者comlen减少为0,就直接返回空字串。
char* longestCommonPrefix(char** strs, int strsSize) {
int i,j,k;
char* s,* retstr;
int comlen; //comlen标记最大前缀字符串的长度
if(strsSize<1) //若字符串数组长度为0,返回空字符串""
{
return "";
}
k=0;
for(i=1;i<strsSize;i++)
{
comlen=strlen(strs[k]);
if(strlen(strs[i])<comlen)
{
k=i;
if(strlen(strs[k])==0)
return "";
}
}
comlen=strlen(strs[k]);
for(i=0;i<strsSize;i++)
{
s=strs[i]; //第i个字符串
if(comlen==0 ) //若comlen=0,返回空字符串""
{
return "";
}
for(j=0;j<comlen;j++)
{
if(strs[k][j] != s[j]) //比较两字符串中的字符
{
comlen=j;
break;
}
}
}
if(comlen==0)
{
return "";
}
retstr=(char*)malloc((comlen+1)*sizeof(char));
memcpy(retstr,strs[k],comlen*sizeof(char));
retstr[comlen]='\0';
return retstr;
}
注意:
二级指针如何动态分配空间
假设定义一个二级指针**p,首先给他(指针数组)分配内存;然后给指针数组中的每一个指针元素动态的分配100bytes的内存。
p=(char**)malloc(20*sizeof(char*));
for(int i=0;i<20;i++)
{
p[i]=(char*)malloc(100*sizeof(char));
}
例如调用上述函数longestCommonPrefix()的主函数:
char** strs=(char**)malloc(2*sizeof(char*));
*strs=(char*)malloc(3*sizeof(char));
*(strs+1)=(char*)malloc(4*sizeof(char));
*strs="abd";
strs[1]="abcd";
char*ret=longestCommonPrefix(strs,2);