您的位置:首页 > 编程语言 > Java开发

(JAVA)LeetCode-14. Longest Common Prefix

2016-05-24 20:01 603 查看
Write a function to find the longest common prefix string amongst an array of strings.

这道题其实蛮简单的,就是找公共前缀,先找前两个的公共前缀,再加上第三个,一直到最后即可,可是我刚看了trie树,本想装个×,结果速度好慢。

以下是我的代码,用所有的字符串组成一个trie树,然后从树根开始,如果哪一层有两个节点非空了,说明出现不同字符了。注意一点就是如果有字符串结束了那程序也该结束了。

用的字符集是大小写字母加上数字

public class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0)
return "";
TrieST<Integer> trie = new TrieST<Integer>(Alphabet.BASE64);
int i = 0;
for(String ss : strs){
if(ss.equals(""))
return "";
trie.put(ss, i++);
}
return trie.longestComPre();
}
}

class TrieST<Value> {

private Alphabet alpha;
private static int R;
private Node root;

public TrieST(Alphabet alpha){
this.alpha = alpha;
R = alpha.R();
}
private static class Node{
private Object val;
private Node[] next = new Node[R];
}

@SuppressWarnings("unchecked")
public Value get(String key){
Node x = get(root, key, 0);
if(x == null)
return null;
return (Value)x.val;
}

private Node get(Node x, String key, int d) {
// TODO Auto-generated method stub
if(x == null)
return null;
if(d == key.length())
return x;
char c = key.charAt(d);
return get(x.next[alpha.toIndex(c)],key,d+1);
}

public void put(String key, Value v){
root = put(root, key, v, 0);
}

private Node put(Node x, String key, Value val, int d){
if(x == null)
x = new Node();
if(d == key.length()){
x.val = val;
return x;
}
char c = key.charAt(d);
x.next[alpha.toIndex(c)] = put(x.next[alpha.toIndex(c)], key, val, d+1);
return x;
}

public String longestComPre(){
return longestComPre(root,"");
}

private String longestComPre(Node x, String str){
int i = 0;
int num = -1;
int index = -1;
for(Node n : x.next){
index ++;
if(n != null){
i++;
num = index;
}
}
if(i==1 && x.val == null){
//	System.out.println(num+" "+i+" "+x.val);
return longestComPre(x.next[num],str+alpha.toChar(num));
}
else{
return str;
}
}

}

class Alphabet {
public static final Alphabet BASE64 = new Alphabet("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");

private char[] alphabet;     // the characters in the alphabet
private int[] inverse;       // indices
private int R;               // the radix of the alphabet

public Alphabet(String alpha) {

// check that alphabet contains no duplicate chars
boolean[] unicode = new boolean[Character.MAX_VALUE];
for (int i = 0; i < alpha.length(); i++) {
char c = alpha.charAt(i);
if (unicode[c])
throw new IllegalArgumentException("Illegal alphabet: repeated character = '" + c + "'");
unicode[c] = true;
}

alphabet = alpha.toCharArray();
R = alpha.length();
inverse = new int[Character.MAX_VALUE];
for (int i = 0; i < inverse.length; i++)
inverse[i] = -1;

// can't use char since R can be as big as 65,536
for (int c = 0; c < R; c++)
inverse[alphabet[c]] = c;
}

public int R() {
return R;
}

public int toIndex(char c) {
if (c >= inverse.length || inverse[c] == -1) {
throw new IllegalArgumentException("Character " + c + " not in alphabet");
}
return inverse[c];
}

public char toChar(int index) {
if (index < 0 || index >= R) {
throw new IndexOutOfBoundsException("Alphabet index out of bounds");
}
return alphabet[index];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: