编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串
""
。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
方法一:扫描法
char * longestCommonPrefix(char ** strs, int strsSize)
{
if(strsSize == 0)
return "";
for(int i=0; i < strlen(strs[0]); i++)
{
for(int j=0; j < strsSize; j++)
{
if(strs[j][i] != strs[0][i])
{
strs[0][i] = '\0';
return strs[0];
}
}
}
return strs[0];
}
- 时间复杂度:O(mn),m和n分别为字符串平均长度和字符串个数。
- 空间复杂度:O(1)。
方法二:分治法
(copy C++解法,c还未实现)
//(但如果是c这样字符数组分治法的分在这里是不是没必要了?)
public String longestCommonPrefix(String[] strs) {
if ( strs.length==0 || strs==null ) {
return "";
}
return divide(strs, 0, strs.length-1);
}
public String divide(String[] s, int left, int right) {
if ( left==right) return s[left];
int mid = (left+right)/2;
String s1 = divide(s, left, mid);
String s2 = divide(s, mid+1, right);
return Prefix(s1, s2);
}
public String Prefix(String s1, String s2) {
int length = Math.min(s1.length(), s2.length());
int index=0;
for ( int i=0; i<length; i++ ) {
if ( s1.charAt(i)!= s2.charAt(i) ) {
break;
}
index++;
}
return s1.substring(0, index);
}
}
char * longestCommonPrefix(char ** strs, int strsSize)
{
int mid=strsSize/2;
char *s1=longestCommonPrefix(strs,0,mid);
char *s2=longestCommonPrefix(strs,mid+1,strs-1);
//int len=Math.min(s1.length,s2.length);
...
}