问题描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
解题思路
1、逐个对比法,会略微比较麻烦,主要思想就是对每个字符串的每个位置进行逐个对比,方法比较容易理解。
class Solution {
public String longestCommonPrefix(String[] strs) {
//这个问题需要排除两种特殊情况,为了代码的简洁性单独写了一个check函数对strs做检查
if(!check(strs)){
return "";
}else{
//定义变量length来寻找字符串数组中最短的字符串长度,用作后续检验的依据
int length = strs[0].toCharArray().length, temp, j;
for(int i =0;i<strs.length-1; i++){
temp = strs[i].toCharArray().length > strs[i+1].toCharArray().length ? strs[i+1].toCharArray().length:strs[i].toCharArray().length;
length = length>=temp?temp:length;
}
//[i]是StringArray的位置,[j]是String分割后CharArray的位置,定[j]变[i]逐个位置对比,存在不同时跳出大循环
out:for(j = 0; j < length; j++){
for(int i = 0; i< strs.length; i++){
if(!String.valueOf(strs[0].toCharArray()[j]).equals(String.valueOf(strs[i].toCharArray()[j]))){
break out;
}
}
}
//利用substring方法切割strs[0]获取我们所需要的string
return (String)strs[0].substring(0, j);
}
}
//自定义check函数,主要检验了空字符串{}和{""}两种特殊情况
public boolean check(String[] strs){
boolean result = true;
if(strs.length == 0){
result = false;
}else{
for(int i = 0; i< strs.length; i++){
if(strs[i].equals("")){
result = false;
}
}
}
return result;
}
}
2、利用string.startsWith()方法来匹配字符串前端,检查是否一致,不一致就将比对的字符串剪掉一位,继续对比。
class Solution {
public String longestCommonPrefix(String[] strs) {
//排除一种特殊情况,即字符串数组里没有内容
if(strs.length == 0) return "";
//利用for循环对字符串数组里的字符串逐一判断
for(String string : strs){
//用strs[0]和strs[i]进行比较,如果strs[0]不是strs[i]的前缀,就去掉strs[0]最后一位,一直去到strs[0]能作为strs[i]前缀为止
while(!string.startsWith(strs[0])){
if(strs[0].length() == 0) return "";
strs[0] = strs[0].substring(0, strs[0].length() - 1);
}
}
return strs[0];
}
}