Write a function to find the longest common prefix string amongst an array of strings.
问题描述:写一个函数来查找字符串数组中最长的公共前缀字符串。
分析:题目给出一个的是一个字符串数组,所以要考虑以下情况:
(1)当字符串数组中含有""空字符串时,则最长公共前缀为空,直接返回结果;
(2)当字符串数组只有一个元素时,最长公共前缀为其本身,直接返回;
(3)当字符串数组长度>=2时,循环遍历字符串数组,分别两两比较找出其最长公共前缀,有以下几种情况:
(a)当进行比较的相邻两个字符串相等时,最长公共前缀则为这个字符串,不用进行接下来的比较;
(b)当进行比较的相邻两个字符串不相等时,选两个字符串中长度较短的值作为循环中止条件,循环逐个判断两个字符串中的字符是否相等。若相等则添加到公共前缀字符串res中;若不相等则退出本次循环,比较的两个字符串的最长公共字符串保存在result中。
每次循环比较得到的两个字符串的最长公共前缀要和上次循环的得到的最长公共前缀比较,选择长度较短的保存在ressult中,循环结束后返回result。
public class Solution {
public static String longestCommonPrefix(String[] strs) {
String result = "";
String res = "";
String str = "";
int length = 0;
if(strs.length>1){
for(int i=0;i<strs.length;i++){
if(i<strs.length-1){
str = strs[i+1];
if(strs[i].equals("")||strs[i+1].equals(""))
return "";
else if(strs[i].equals(str)){
res = strs[i];
}
else{
if(strs[i].length()>str.length())
length = str.length();
else
length = strs[i].length();
res = "";
for(int j=0;j<length;j++){
if(strs[i].charAt(j)==str.charAt(j)){
res += str.charAt(j);
}
else
break;
}
}
if(i==0 && result.equals(""))
result = res;
else if(result.equals(""))
return "";
if(result.length()>res.length())
result = res;
}
}
}
else{
for(String s:strs){
result=s;
break;
}
}
return result;
}
}
这是自己最开始的解决方案,后来想到没有必要两两都比较求最长公共前缀,可先将最长公共前缀赋值为strs[0],然后以此为基准将其他字符串与此目前的最长公共前缀比较,求得最长公共前缀。
public class Solution {
public static String longestCommonPrefix(String[] strs) {
if(strs.length==0)
return "";
String result = strs[0];
String res = "";
String str = "";
int length = 0;
if(strs.length>1){
for(int i=1;i<strs.length;i++){
str = strs[i];
if(!result.equals(str)){
if(result.length()>str.length())
length = str.length();
else
length = result.length();
res = "";
for(int j=0;j<length;j++){
if(result.charAt(j)==str.charAt(j)){
res += str.charAt(j);
}else
break;
}
}
else
res = result;
if(result.length()>res.length())
result = res;
}
}
else
result = strs[0];
return result;
}
}
后来又在网上找到了一种更高效率的解决思路:首先判断是否为空,为空则直接返回“”;不为空则先求得字符串数组中字符串长度最短的值,然后作为for循环的中止条件。以字符串数组的第一个字符串为基准,循环获得字符串,然后与该字符串数组中对应的字符比较,一旦与字符串数组中对应的字符不相等时(因为是求最长公共前缀,所以字符串数组中每个字符串相同索引的对应的字符是相等的),则退出循环,返回结果。代码如下:
public class Solution {
public static String longestCommonPrefix(String[] strs) {
if(strs.length==0)
return "";
int minlength = Integer.MAX_VALUE;
String result = "";
char ch;
for(String str:strs){
if(str.length()<minlength)
minlength = str.length();
}
for(int i=0;i<minlength;i++){
ch = strs[0].charAt(i);
for(String str:strs){
if(str.charAt(i)!=ch)
return result;
}
result +=ch;
}
return result;
}
}