题目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/5/strings/40/
题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
思路:我把题目理解为寻找最长公共子序列了。其实这题求前缀就简单多了。但是解题的方法很多。好的方法比较难想到。
很多方法详情在这:https://leetcode.com/problems/longest-common-prefix
//解法1:基于LCP算法。横向扫描法
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++)
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
return prefix;
}
}
解法2:竖向扫描
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
for (int i = 0; i < strs[0].length() ; i++){
char c = strs[0].charAt(i);
for (int j = 1; j < strs.length; j ++) {
if (i == strs[j].length() || strs[j].charAt(i) != c)
return strs[0].substring(0, i);
}
}
return strs[0];
}
//解法3:暴力破解
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
if (strs.length == 1) {
return strs[0];
}
int minlength = Integer.MAX_VALUE;
for (int i = 0; i < strs.length; i++) {
minlength = Math.min(strs[i].length(), minlength);
}
String prefix = "";
Outer: for (int i = 0; i <= strs[0].length(); i++) {
String tmp = strs[0].substring(0, i);
for (int j = 1; j < strs.length; j++) {
if (!strs[j].startsWith(tmp)) {
break Outer;
}
}
prefix = tmp;
}
return prefix;
}