编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
leetcode上常见的解法如下,但如果将下面代码放进VS编译时strs[0][j]='\0';这个语句是不能执行的,因为它在修改常量字符串。但leetcode是可以通过的,我也不太明白。我对其做了些改动,如第二个代码块。
char * longestCommonPrefix(char ** strs, int strsSize){//strSize:最长公共前缀
int i,j;
if(strsSize==0)
return "";
//纵向扫描,一列一列看直到找到有字符不一样的
for(i=0;i<strsSize;i++)
{
for(j=0;j<strlen(strs[0]);j++){
if(strs[i][j]!=strs[0][j]) //第j列不同,已经找到最长公共前缀
strs[0][j]='\0'; //保存最长公共前缀
//strs[0];
}
}
return strs[0];
}
作者:cai-niao-yi-ge-9
链接:https://leetcode.cn/problems/longest-common-prefix/solution/by-cai-niao-yi-ge-9-xqpa/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
基于以上代码中加入一个数组存放相同的前缀再返回,而不需要修改字符串,不足之处是数组开辟空间会出现浪费。并且由于leetcode的测试例子是连续的调用我这个函数,所以那个静态变量每一次都要用memset置空。
char * longestCommonPrefix(char ** strs, int strsSize){
int L = strlen(strs[0]);
static char arr[200];
for (int i = 0; i<L; i++)
{
for (int j = 1; j < strsSize; j++)
{
if (strs[0][i] != strs[j][i])
{
memset(arr, '\0', sizeof(arr));
for (int k = 0; k < i; k++)
{
arr[k] = strs[0][k];
}
return arr;
}
}
}
return strs[0];
}