描述
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
.
思路
由於一開始的時候審題不夠仔細,認為只需要從頭進行遍歷字串陣列中相同位置的字元並判斷是否相等的情況即可,忽視了從字串非開始位置的匹配。
class Solution {
public String longestCommonPrefix(String[] strs) {
StringBuffer out = new StringBuffer();
if(strs.length == 0){
return out.toString();
}
//獲取陣列中最短的字串
int minLen = Integer.MAX_VALUE;
for(int i = 0; i<strs.length; i++){
if(minLen > strs[i].length()){
minLen = strs[i].length();
}
}
//從開頭逐個字元進行比對
for(int i = 0;i< minLen; i++){
boolean flag = true;
for(int j = 1;j<strs.length;j++){
if(strs[j].charAt(i) != strs[0].charAt(i)){
flag = false;
break;
}
}
if(flag){
out.append(strs[0].charAt(i));
}
}
return out.toString();
}
}複製程式碼
以下的情況不能夠通過:
["aca","cba"]複製程式碼
變換思路
使用Java的子串匹配庫函式,獲取某個串是否包含當前子串。如果要選擇所有字串的公共子串,那麼這個公共子串肯定是給出字串陣列某個字串能夠匹配到的最短子串,即要求的公共子串是眾多(為陣列中的每個字串匹配)子串中最短的。故可以對匹配的串只做截斷操作。
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return "";
}
//使用第一個字串作為子串,並不斷截斷
String pre = strs[0];
//求每一個字串的子串
for(int i = 1; i<strs.length; i++){
//不含有當前子串就對子串進行截斷
while(strs[i].indexOf(pre) != 0){
pre = pre.substring(0, pre.length() - 1);
}
}
return pre;
}
}複製程式碼
Runtime: 0 ms, faster than 100.00% of Java online submissions for Longest Common Prefix.
Memory Usage: 38 MB, less than 80.70% of Java online submissions for Longest Common Prefix.
但是這種方法對於最長子串不是出現在第一個字串開頭位置的情況不能夠適用。
解題的關鍵在於,能夠意識到公共最長子串是受限於最短的那個,以及indexOf()
函式和substring()
函式的用法。