// 暴力,从最短的开始逐个匹配,注意样例有[]
class Solution {
public String longestCommonPrefix(String[] strs){
if (strs == null || strs.length == 0) return "";
int len = strs[0].length();
int minIndex = 0;
for (int i = 1; i < strs.length; i++){
if (len > strs[i].length()){
minIndex = i;
len = strs[i].length();
}
}
String s = "";
for (int i = len; i > 0; i--){
s = strs[minIndex].substring(0, i);
boolean flag = true;
for (int j = 0;j <strs.length; j++){
if (j == minIndex) continue;
if (!strs[j].substring(0,i).equals(s)) {
flag = false;
break;
}
}
if (flag) return s;
}
return "";
}
}
// 或者字典树Trie
class Solution {
public String longestCommonPrefix(String[] strs){
if (strs == null || strs.length == 0) return "";
Trie trie = new Trie();
for (String s: strs){
trie.insert(s);
}
for (int i = strs[0].length() ;i > 0; i--){
String s = strs[0].substring(0,i);
if (trie.query(s) == strs.length)
return s;
}
return "";
}
}
class Trie{
final int MAXN = 40000;
int[][] ch = new int[MAXN][26];
int[] val = new int[MAXN];
int sz = 1;
public Trie(){
Arrays.fill(ch[0],0);
val[0] = 0;
}
int idx(char c){
return c - 'a';
}
public void insert(String s){
int u = 0;
int n = s.length();
for (int i = 0;i < n; i++){
int c = idx(s.charAt(i));
if (ch[u][c] == 0){
Arrays.fill(ch[sz], 0);
val[sz] = 0;
ch[u][c] = sz++;
}
val[u]++;
u = ch[u][c];
}
val[u]++;
}
public int query(String s){
int u = 0;
int n = s.length();
for (int i = 0;i < n;i ++){
int c = idx(s.charAt(i));
if (ch[u][c] == 0){
return 0;
}
u = ch[u][c];
}
return val[u];
}
}