package com.interview.books.ccinterview;
import com.interview.utils.ConsoleWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-12-14
* Time: 下午2:25
*/
public class CC35_SubstringSearcher {
class SuffixTreeNode {
char value;
HashMap<Character, SuffixTreeNode> children = new HashMap<>();
List<Integer> indexes = new ArrayList<>();
public SuffixTreeNode(char ch) {
this.value = ch;
}
public void insertString(String s, int index) {
if (s == null || s.length() <= 0) return;
char first = s.charAt(0);
SuffixTreeNode child = children.get(first);
if (child == null) {
child = new SuffixTreeNode(first);
children.put(first, child);
}
String reminder = s.substring(1);
child.indexes.add(index);
child.insertString(reminder, index);
}
public List<Integer> search(String s) {
if (s == null || s.length() == 0) return indexes;
char first = s.charAt(0);
if (children.containsKey(first)) {
String reminder = s.substring(1);
return children.get(first).search(reminder);
}
return new ArrayList<>();
}
}
SuffixTreeNode root = new SuffixTreeNode('#');
public CC35_SubstringSearcher(String s) {
for (int i = 0; i < s.length(); i++) {
String suffix = s.substring(i);
root.insertString(suffix, i);
}
}
public List<Integer> search(String s) {
return root.search(s);
}
public static void main(String[] args) {
CC35_SubstringSearcher searcher = new CC35_SubstringSearcher("abcdabdefcd");
String[] T = new String[]{"ab", "abc", "def", "cd", "d"};
for (String t : T) {
System.out.print(t + ": ");
ConsoleWriter.printCollection(searcher.search(t));
}
}
}