(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树,然后从树根开始,如果哪一层有两个节点非空了,说明出现不同字符了。注意一点就是如果有字符串结束了那程序也该结束了。
用的字符集是大小写字母加上数字
这道题其实蛮简单的,就是找公共前缀,先找前两个的公共前缀,再加上第三个,一直到最后即可,可是我刚看了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]; } }
相关文章推荐
- Java设计模式之单例模式
- Java数组预处理实现费切那波数列
- HotSpot虚拟机在Java堆中对对象的管理
- 工具类系列-JavaBean2Map
- jdk在myeclipse中的配置
- java I/O 学习笔记
- How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0
- Java集合框架概述
- java中的sleep()和wait()的区别
- JavaScrip学习笔记(四)---DOM基础
- Spark Streaming源码解读之Driver容错安全性
- java截取url中的值
- java,你是谁?
- Ubuntu-16.04安装jdk
- JSP学习笔记(4)-Javabean
- java-swing-设置窗体大小
- java之十 高级IO流
- java之十 高级IO流
- java之十 高级IO流
- 安装JDK