題目描述
編寫一個函數來查找字符串數組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 ""。
示例 1:
輸入: ["flower","flow","flight"]
輸出: "fl"
示例 2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。
說明:
所有輸入只包含小寫字母 a-z 。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-common-prefix
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
白話題目:
一推字符串,前綴----從頭開始數唄,公共前綴,就是前面的都一樣。只有a-z的小寫字母
算法:
我們今天用最笨的辦法過這個題就好了,先這樣,看這些單詞就是這樣存的,之後我們就逐列 逐行的比較每一個字符(字母),
一行一行的往下爬,走到最下面之後都相等的話,我們就認爲我們的這一例is OK,再從第一行開始,去比較第二列,周而復始,無窮無盡,也不是( i < strsSize && strs[i][j] != '\0')
找到後就把位置內的元素輸出唄。
Tips:(1)字符串數組的這種存儲方式會不?不會沒關係,看下面的代碼
(2)返回值的輸出變量涉及到局部變量的一些問題,這裏也是有坑的,會跳不?不會沒關係,看下面代碼,要申請地址滴
?什麼?我沒寫的明白,沒問題,看視頻啊,視頻裏話說的更直白更囉嗦的。
詳細解釋關注 B站 【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB
C語言完全代碼
#include <stdio.h>
#include <stdlib.h>
char * longestCommonPrefix(char ** strs, int strsSize)
{
if (strsSize == 1)
return strs[0]; //一個就是自己
char *p = NULL;
int i, j = 0;
for (i = 0; i < strsSize && strs[i][j] != '\0'; ++i)
{
if (strs[i][j] != strs[i+1][j]) //和下一行的比,
break;
if (i == strsSize-2)
{
i = -1; //第一個字母比較完了,從頭開始比第二個
++j;
}
}
p = (char *)malloc(sizeof(char) * (j+1)); //得這麼申請的才能返回
for (i = 0; i < j; ++i)
p[i] = strs[0][i];
p[i] = '\0';
return p;
}
int main()
{
int strsSize;
scanf("%d",&strsSize);
//char* strs[strsSize]; 都行
char **strs=(char **)malloc(strsSize*sizeof(char));
int m;
for ( m = 0; m < strsSize; m ++)
{
strs[m]=(char*)malloc(100*sizeof(char));
scanf("%s",strs[m]); //就是指針的地址
}
for ( m = 0; m < strsSize; m ++)
{
printf("%s\n",strs[m]);
}
char *result=longestCommonPrefix(strs,strsSize);
printf("%s\n", result);//
return 0;
}