Problem
Given a string s and an array of smaller strings T, design a method to search s for each small string in T.
Solution
Method 1 - Using suffix treeWe can first get all the suffices of s and check for each element t in T to see if t is the beginning part of any suffices. To make this more efficient, we can build a suffix tree and do the operations.
For example, s = “mississippi”; T = { “is”, “sip”, “hi”, “sis” }.
The suffices of s
[0] | “mississippi” |
[1] | “ississippi” |
[2] | “ssissippi” |
[3] | “sissippi” |
[4] | “issippi” |
[5] | “ssippi” |
[6] | “sippi” |
[7] | “ippi” |
[8] | “ppi” |
[9] | “pi” |
[10] | “i” |
Then for “is” in T, we see it sits in the beginning of suffices [1] and [4]. for “sip”, we see it in [6]. We do not see any “hi” in the suffices but we do see “sis” in [3].
Java code
public static class SuffixTree { SuffixTreeNode root = new SuffixTreeNode(); public SuffixTree(String s) { for (int i = 0; i < s.length(); ++i) { root.insert(s.substring(i), i); } } public List<Integer> getIndexes(String s) { return root.getIndices(s); } } public static class SuffixTreeNode { private char c; private List<Integer> indices = new ArrayList<Integer>();; private Map<Character, SuffixTreeNode> children = new HashMap<Character, SuffixTreeNode>(); public void insert(String s, int index) { indices.add(index); if (s != null && s.length() > 0) { char character = s.charAt(0); if (children.keySet().contains(character)) { children.get(character).insert( s.substring(1), index); } else { SuffixTreeNode child = new SuffixTreeNode(); children.put(character, child); child.insert(s.substring(1), index); } } } public List<Integer> getIndices(String s) { if (s == null || s.length() == 0) return indices; else { char character = s.charAt(0); if (children.containsKey(character)) return children.get(character).getIndices( s.substring(1)); else return null; } } }
Thanks.
References
0 comments:
Post a Comment