题目如下:
Write a function to find the longest common prefix string amongst an array of strings.
给定一个String类型数组,要求写一个方法,返回数组中这些字符串的最长公共前缀。举个例子:假如数组为["123","12","4"],经过这个方法返回的结果就应该是""。因为"123","12","4"并没有共同的前缀,虽然"123","12"的公共最长前缀是"12",但是这个公共前缀"12"与"4"没有公共前缀,所以最后返回的结果就是""。
最简单的思路就是将str[0],当作临时最长公共前缀,然后用这个前缀依次和剩下的字符串进行前缀比较,都比较完后,就将最后得到的最新公共最长前缀返回即可。直接放已Accepted的代码,如下所示:
public String longestCommonPrefix(String[] strs) {
String result = strs.length==0?"":strs[0];
for(int j=0;j<strs.length;j++){
result = commonPrefix(result,strs[j]);
}
return result;
}
private String commonPrefix(String origin,String target){
StringBuffer sb = new StringBuffer();
int loop = origin.length()>=target.length()?target.length():origin.length();
for(int i=0;i<loop;i++){
if(origin.charAt(i) == target.charAt(i)){
sb.append(origin.charAt(i));
}else{
break;
}
}
return sb.toString();
}
然后是评论区的方法,有一个挺有意思的直接放代码了:
public String longestCommonPrefix(String[] strs) {
StringBuilder result = new StringBuilder();
if (strs!= null && strs.length > 0){
Arrays.sort(strs);
char [] a = strs[0].toCharArray();
char [] b = strs[strs.length-1].toCharArray();
for (int i = 0; i < a.length; i ++){
if (b.length > i && b[i] == a[i]){
result.append(b[i]);
}
else {
return result.toString();
}
}
return result.toString();
}
以下是解释,直接引用原文了,非常精辟:“
Sort the array first, and then you can simply compare the first and last elements in the sorted array.”
然后是下面这种,有点偷鸡,利用了字符串的indexOf方法,通过返回位置是不是0判断是不是公共前缀,如果返回值不是0,就将这个临时公共前缀删除最后一个字符,在进行尝试,直到返回值为0为止,代码如下:
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String pre = strs[0];
for (int i = 1; i < strs.length; i++)
while(strs[i].indexOf(pre) != 0)
pre = pre.substring(0,pre.length()-1);
return pre;
}
大致就是这么一些方法,如果有更好的,欢迎到评论区补充~