题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
- 1 <= strs.length <= 200
- 0 <= strs[i].length <= 200
- strs[i] 仅由小写英文字母组成
我的题解
- 思路
因为最长公共子串一定存在于最短的字符串中,由此即可确定循环边界。然后双重循环一个一个字符比较,内层循环每次正常结束再进行字符连接,否则跳出循环。
- show me the code
int minStrLengthIndex(char **str, int strsSize){
int minLength = strlen(str[0]);
int index = 0;
for(int i = 0;i < strsSize;i++){
int size = strlen(str[i]);
if(size <= minLength){
minLength = size;
index = i;
}
}
return index;
}
char * longestCommonPrefix_oom(char ** strs, int strsSize){
if(strsSize == 0){
return "";
}
if(strsSize == 1){
return strs[0];
}
int minLengthIndex = minStrLengthIndex(strs, strsSize);
int minLength = strlen(strs[minLengthIndex]);
// printf("%d, %d", minLengthIndex, minLength);
// 因为这里后续需要加上'\0'结束符所以要预留一个长度。
char *res = (char *)malloc(sizeof(char)*(minLength + 1));
int p = 0;
for(int i = 0;i < minLength;i++){
bool tag = true;
for(int j = 0;j < strsSize - 1;j++){
if(strs[j][i] == strs[j + 1][i]){
// printf("%c,%c\n", strs[j][i], strs[j + 1][i]);
}else{
tag = false;
break;
}
}
if(tag){
res[p] = strs[strsSize - 1][i];
p++;
res[p] = '\0';
}else{
break;
}
}
if(p == 0){
return "";
}
return res;
}
- 提交结果
看到另外一种解法,其实求最小字符串是不必要的,因为在循环中两字符串在比对中遇到’\0’也是不相等的情况之一,所以不需要额外求最小串。由最后跳出循环的字符串索引,即可得到最长公共字符串。整体代码量少得多。
- show me the code
char * longestCommonPrefix(char ** strs, int strsSize){
int i = 0;
bool flag = true;
if(strsSize == 0){
return "";
}
for(i = 0;flag && strs[0][i] != '\0';i++){
for(int j = 1;j < strsSize;j++){
if(strs[0][i] != strs[j][i]){
flag = false;
break;
}
}
if(!flag){
break;
}
}
char *res;
res = (char *)malloc(sizeof(char)*(i+1));
memcpy(res, strs[0], i);
res[i] = '\0';
return res;
}
原题链接:https://leetcode-cn.com/problems/longest-common-prefix