Q:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
A:
最简单的方法:
public static String longestCommonPrefix(String[] strs) {
if (strs.length == 0)
return "";
if (strs.length == 1)
return strs[0];
int minLen = Integer.MAX_VALUE;
for (String s : strs) {
int len = s.length();
minLen = Math.min(minLen, len);
}
String sub = "";
boolean flag = false;
for (int i = 0; i < minLen; i++) {
char c = strs[0].charAt(i);
for (String str : strs) {
if (str.charAt(i) != c) {
flag = true;
sub = str.substring(0, i);
}
}
if (flag)
break;
}
if (!flag) {
sub = strs[0].substring(0, minLen);
}
return sub;
}
对字符串数组进行排序,然后只要比较首尾两个字符串即可
public String longestCommonPrefix(String[] strs) {
StringBuilder result = new StringBuilder();
if (strs!= null && strs.length > 0){
Arrays.sort(strs);
char [] a = strs[0].toCharArray();
char [] b = strs[strs.length-1].toCharArray();
for (int i = 0; i < a.length; i ++){
if (b.length > i && b[i] == a[i]){
result.append(b[i]);
}
else {
return result.toString();
}
}
return result.toString();
}
分治法:
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0)
return "";
return longestCommon(strs, 0, strs.length - 1);
}
private String longestCommon(String[] strs, int start, int end) {
if (start == end)
return strs[start];
int mid = (start + end) / 2;
String left = longestCommon(strs, start, mid);
String right = longestCommon(strs, mid + 1, end);
return commonPrefix(left, right);
}
private String commonPrefix(String left, String right) {//这里也可以用二分查找
int minLen = Math.min(left.length(), right.length());
for (int i = 0; i < minLen; i++) {
if (left.charAt(i) != right.charAt(i))
return left.substring(0, i);
}
return left.substring(0, minLen);
}
还有使用字典树(直接借用了别人的,链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode/)
public String longestCommonPrefix(String q, String[] strs) {
if (strs == null || strs.length == 0)
return "";
if (strs.length == 1)
return strs[0];
Trie trie = new Trie();
for (int i = 1; i < strs.length ; i++) {
trie.insert(strs[i]);
}
return trie.searchLongestPrefix(q);
}
class TrieNode {
// 子节点的链接数组
private TrieNode[] links;
private final int R = 26;
private boolean isEnd;
// 非空子节点的数量
private int size;
public void put(char ch, TrieNode node) {
links[ch -'a'] = node;
size++;
}
public int getLinks() {
return size;
}
// 假设方法 containsKey、isEnd、get、put 都已经实现了
// 可以参考文章:https://leetcode.com/articles/implement-trie-prefix-tree/
}
public class Trie {
private TrieNode root;
public Trie() {
root = new TrieNode();
}
// 假设方法 insert、search、searchPrefix 都已经实现了
// 可以参考文章:https://leetcode.com/articles/implement-trie-prefix-tree/
private String searchLongestPrefix(String word) {
TrieNode node = root;
StringBuilder prefix = new StringBuilder();
for (int i = 0; i < word.length(); i++) {
char curLetter = word.charAt(i);
if (node.containsKey(curLetter) && (node.getLinks() == 1) && (!node.isEnd())) {
prefix.append(curLetter);
node = node.get(curLetter);
}
else
return prefix.toString();
}
return prefix.toString();
}
}