18.8 suffix tree
给定一个字符串s 和 一个包含较短字符串的数组t,设计一个方法,根据t中的每一个较短的字符换,对s进行搜索。
思路:基于s建立后缀树,然后在后缀树中进行查找,返回所有可能的索引值。
import java.util.ArrayList; public class Question { public static void main(String[] args) { String testString = "bibs"; String[] stringList = {"b", "bs", "hi", "bb"}; SuffixTree tree = new SuffixTree(testString); for (String s : stringList) { ArrayList<Integer> list = tree.search(s); if (list != null) { System.out.println(s + ": " + list.toString()); } } } }
/**
b: [0, 2]
bs: [2]
*/
import java.util.ArrayList; public class SuffixTree { SuffixTreeNode root = new SuffixTreeNode(); public SuffixTree(String s) { for (int i = 0; i < s.length(); i++) { String suffix = s.substring(i); root.insertString(suffix, i); } } public ArrayList<Integer> search(String s) { return root.search(s); } }
package Question18_8; import java.util.ArrayList; import java.util.HashMap; public class SuffixTreeNode { HashMap<Character, SuffixTreeNode> children = new HashMap<Character, SuffixTreeNode>(); char value; ArrayList<Integer> indexes = new ArrayList<Integer>(); public SuffixTreeNode() { } public void insertString(String s, int index) { indexes.add(index); if (s != null && s.length() > 0) { value = s.charAt(0); SuffixTreeNode child = null; if (children.containsKey(value)) { child = children.get(value); } else { child = new SuffixTreeNode(); children.put(value, child); } String remainder = s.substring(1); child.insertString(remainder, index); } } public ArrayList<Integer> search(String s) { if (s == null || s.length() == 0) { return indexes; } else { char first = s.charAt(0); if (children.containsKey(first)) { String remainder = s.substring(1); return children.get(first).search(remainder); } } return null; } }