[LeetCode 14]
Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings.
Sample
["abca","aba","aaab"]
output
"a"
/**这道题算是很经典的一道,c语言不准返回一个局部指针,所以不能使用 char * ret这样的声明作为返回(原因见下方蓝色字)
*但配合malloc/free,再将ret作为全局变量也是可行的。
*Params:
*strs--->此处可以理解为二维字符串数组的名字
*strsSize-->有多少个待比较的字符串,上诉给的Sample中strsSize=3
**/
char* longestCommonPrefix(char** strs, int strsSize) {
int i, j, dif=1, index=0; //dif 表示比较过程中出现字符不相同赋值为0 index代表此下标之前的字符都相同
static char ret[1024]; //必须为静态的,不然返回局部变量释放,结果永远是NULL
int rows=2;
if(strsSize==0) return ""; //对应LeetCode测试用例 []
if(strsSize==1) return strs[0]; //只有一个字符串,直接原字符串返回
int coloumMin=strlen(strs[0]);
for(i=1;i < strsSize; i++) //获取字符串中最小的例数
if(strlen(strs[i])<coloumMin)
coloumMin=strlen(strs[i]);
//printf("cols=%d\n",coloumMin);
if(coloumMin==0) return ""; //对应LeetCode测试用例 ["", ""]
for(i=0;i<coloumMin;i++){
dif=1; //每次都得重新初始化
for(j=0;j < strsSize-1;j++){
if(strs[j][i] !='\0'&& strs[j+1][i] !='\0')
{
if(strs[j][i] == strs[j+1][i]) continue;
else
{
dif=0;
if(i == 0) return "";
break;
}
}
else break;
}
if(j == strsSize-1 || dif == 1)
{
index=i;
ret[i]=strs[0][i];
}
}
ret[index+1]='\0'; //将其转化为字符串
//printf("index=%d,ret=%s\n",index,ret);
return ret;
}
期间在LeetCode上遇到,submit solution出错的例子再拿到run code 自定义用例却是正常,出现这种现象的原因是代码确实在逻辑上存在问题,反复修改几次,最终通过。尤其["aa","ab"]用例。