Description
Write a function to find the longest common prefix string amongst an array of strings.
If there is no common prefix, return an empty string “”.
Example 1:
Input: [“flower”,”flow”,”flight”]
Output: “fl”
Example 2:
Input: [“dog”,”racecar”,”car”]
Output: “”
Explanation: There is no common prefix among the input strings.
Note:
All given inputs are in lowercase letters a-z.
题意:根据给出的字符串数组,输出数组中所有字符串的最长共同前缀;
第一种解法:我们知道字符串数组所能匹配的最长的字符串,其实就是字符串数组中最短的那个字符串。因此,我们首先找到最短的这个字符串,从其长度为1的子串开始与其他字符串前缀匹配一直到其最大长度的子串,也即本身,便可以找到其最长的前缀;
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return new String();
}//空串
if(strs.length == 1){
return strs[0];
}//长度为一的字符串数组
int maxLen = Integer.MAX_VALUE;//最短字符串的长度
int maxLenIndex = 0;//标志最短字符串在数组中的位置
for(int i = 0; i < strs.length; i++){
if(strs[i].length() < maxLen){
maxLen = strs[i].length();
maxLenIndex = i;
}
}//找出最短字符串,也即最长可能的匹配串
String maxPrefix = "";//最长的前缀字符串
for(int i = 0; i < maxLen; i++){
//用于匹配的字符串
String str = strs[maxLenIndex].substring(0, i+1);
boolean isPrefix = true;
for(int j = 0; j < strs.length; j++){
if(!strs[j].substring(0, i+1).equals(str)){
isPrefix = false;
break;
}
}
if(isPrefix && maxPrefix.length() < str.length()){
maxPrefix = str;
}
}
return maxPrefix;
}
}
第二种解法:LCP(S1,S2,S3……Sn)=LCP(LCP(LCP(S1,S2),S3)……Sn);即先找出第一、第二个字符串的最长前缀str,再找出str与第三个字符串的最长前缀,一直到与最后一个字符串的最长前缀;
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return new String();
}//空字符串数组
String maxPrefix = strs[0];
for(int i = 1; i < strs.length;
while(strs[i].indexOf(maxPrefix) != 0){
maxPrefix = maxPrefix.substring(0, maxPrefix.length() - 1);//最长前缀长度减1
if(maxPrefix.equals("")){
return new String();
}
}//找到两个串的最长前缀
}
return maxPrefix;
}
}
第三种解法:我们假设字符串数组中的第一个串就是我们要找的最长前缀,现在我们将第一个字符串的每个字母与其他所有字符串进行逐一匹配,直到匹配不成功或者所要匹配的字符串比当前串的长度更短;
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return "";
}//空串
for(int i = 0; i < strs[0].length(); i++){
char ch = strs[0].charAt(i);
for(int j = 1; j < strs.length; j++){
//更短的串或不匹配
if(i == strs[j].length() || ch != strs[j].charAt(i)){
return strs[0].substring(0, i);
}
}
}
return strs[0];
}
}
第四种解法:采用分而治之的思想,将整个字符串分为左右两个,继续分下去直到剩余两个字符串,这时可以得出两个字符串的最长前缀,再逐层的返回;
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return "";
}//空串
return longestCommonPrefix(strs, 0, strs.length-1);
}
private String longestCommonPrefix(String[] strs, int left, int right){
if(left == right){
return strs[left];
}
int mid = (left + right) / 2;
String lcpLeft = longestCommonPrefix(strs, left, mid);
String lcpRight = longestCommonPrefix(strs, mid+1, right);
return commonPrefix(lcpLeft, lcpRight);
}
//返回两个字符串的最长前缀
private String commonPrefix(String left, String right){
int maxLen = left.length() > right.length() ? right.length() : left.length();
for(int i=0; i<maxLen; i++){
if(left.charAt(i) != right.charAt(i)){
return left.substring(0, i);
}
}
return left.substring(0, maxLen);
}
}