题目简介:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
第一种解法:纵向扫描
遍历第一个字符串的字符,并与其余字符串相应位置的字符比较
class Solution {
// 纵向扫描:遍历第一个字符串的字符,并与其余字符串相应位置的字符比较
public String longestCommonPrefix(String[] strs) {
//空值情况
if(strs.length == 0 || strs == null){
return "";
}
for(int i = 0;i<strs[0].length();i++){
char c = strs[0].charAt(i);
for(int j =0; j<strs.length;j++){
//比较结束:长度达到尽头 或 出现了不匹配的前缀
if(i == strs[j].length() || strs[j].charAt(i) != c){
return strs[0].substring(0,i);
}
}
}
//如果上述情况都没有出现,说明第一个字符串的长度最短,且可完全与其他字符的前缀匹配。返回第一个字符串
return strs[0];
}
}
第二种解法:横向扫描
写一个方法,比较两个字符串,返回最长公共前缀
再在主方法中写一个遍历,把数组中的字符串都跟第一个字符串进行比较。
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0){
return "";
}
// 依次遍历字符串数组,更新最长公共前缀
int length = strs.length;
String prefix = strs[0];
for(int i = 1; i < length; i++){
prefix = calPrefix(prefix, strs[i]);
if(prefix.length() == 0){
return prefix
}
}
return prefix;
}
public String calPrefix(String str1, String str2){
int length = Math.min(str1.length(), str2.length());
int index = 0;
for(int i = 0; i < length; i++){
if(str1.charAt(i) != str2.charAt(i)){
break;
}
index++;
}
return str1.substring(0, index);
}
}
其实还有分治法,二分法等方法。但是,我现在还没弄懂分治法究竟是什么……这个思想太大了