题目要求
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
说明:所有输入只包含小写字母 a-z 。
示例
输入:[“flower”,“flow”,“flight”] 输出:“fl”
输入:[“dog”,“racecar”,“car”] 输出:""(输入不存在公共前缀。)
Java解题
- 方法一
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
StringBuilder result = new StringBuilder();
for (int i = 0; i < strs[0].length(); i++){
result.append(strs[0].charAt(i));
for (int j = 1; j < strs.length; j++){
if (strs[j].startsWith(result.toString())) continue;
return result.toString().substring(0, result.toString().length() - 1);
}
}
return result.toString();
}
执行用时:3 ms, 在所有 Java 提交中击败了53.69%的用户
内存消耗:37.3 MB, 在所有 Java 提交中击败了79.72%的用户
解题思路:以数组的第一个字符串作为基准,用基准字符串的子串去比较,子串为从头开始取的长度依次为1,2,3,……的基准子串。
当遇到其他字符串不是以基准子串开头的情况,则返回基准子串长度减一的子串,否则继续判断,累加。
- 方法二
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return "";
}
String str = strs[0];
for(int i = 1; i < strs.length; i++){
while(strs[i].indexOf(str) != 0){
str=str.substring(0, str.length() - 1);
}
}
return str;
}
执行用时:1 ms, 在所有 Java 提交中击败了96.91%的用户
内存消耗:36.1 MB, 在所有 Java 提交中击败了87.28%的用户
解题思路:将字符串数组的第一个字符串元素当成公共子串去比较,只要indexOf方法的返回值不为0就说明不是前缀子串(-1说明不存在,其他数字说明不是前缀,只是子串),第一个字符串元素公共前缀子串就要从末尾截去一位,以此类推。
- 方法三
public String longestCommonPrefix(String[] strs) {
if(strs.length<1)return "";
if(strs.length==1)return strs[0];
StringBuilder result=new StringBuilder();
Arrays.sort(strs);
String first=strs[0];
String end=strs[strs.length-1];
for(int i=0;i<first.length();i++){
if(first.charAt(i)==end.charAt(i))
result.append(first.charAt(i));
else break;
}
return result.toString();
}
执行用时:1 ms, 在所有 Java 提交中击败了96.91%的用户
内存消耗:37.6 MB, 在所有 Java 提交中击败了74.82%的用户
解题思路:将数组进行排序,利用工具类Arrays的封装方法sort,排序之后第一个元素跟最后一个元素的差别是最大的,只需要取第一个元素跟最后一个元素的公共最长前缀子串便可。