描述
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()函数的用法。