编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
我的解答(纵向遍历)这种方法是最容易想到的,也最容易理解:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string result="";
if(strs.size()==0){
return result;
}
for(int i=0;i<200;i++){
if(i>=strs[0].size()){
return result;
}
char num=strs[0][i];
bool issame=true;
for(int j=1;j<strs.size();j++){
if(i>=strs[j].size()){
return result;
}
if(strs[j][i]!=num){
issame=false;
break;
}
}
if(issame){
result+=strs[0][i];
}
else{
return result;
}
}
return result;
}
};
其他解:
横向遍历
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);
}
}
分治(个人认为最好的解法):
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0){
return "";
}
// 分治
return calPrefix(strs, 0, strs.length - 1);
}
public String calPrefix(String[] strs, int start, int end){
if(start == end){
return strs[start];
}
int mid = start + (end - start) / 2;
String left = calPrefix(strs, start, mid);
String right = calPrefix(strs, mid+1, end);
return doCal(left, right);
}
public String doCal(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);
}
}