本题 增加了一个has方法 改了startswith方法
import java.util.*;
public class Substr {
public static class Trie {
private final int ALPHABET_SIZE = 26;
private Trie[] children = new Trie[ALPHABET_SIZE];
boolean isEndOfWord = false;
public Trie() {}
public void insert(String word) {
Trie tmp = this;
for (char i : word.toCharArray()) {
if (tmp.children[i-'a'] == null) {
tmp.children[i-'a'] = new Trie();
}
tmp = tmp.children[i-'a'];
}
tmp.isEndOfWord = true;
}
public boolean search(String word) {
Trie tmp = this;
for (char i : word.toCharArray()) {
if (tmp.children[i-'a'] == null) {
return false;
}
tmp = tmp.children[i-'a'];
}
return tmp.isEndOfWord ? true : false;
}
public boolean startsWith(Trie tmp,String prefix) {
for (char i : prefix.toCharArray()) {
if (tmp.children[i-'a'] == null) {
return false;
}
tmp = tmp.children[i-'a'];
}
return true;
}
public boolean has(Trie tmp,String word){
if(tmp.isEndOfWord == true) return false;
Character c = word.charAt(0);
boolean a = false;
if(tmp.children[c - 'a'] != null){
a = startsWith(tmp,word);
}
int temp = 0;
for (int i = 0; i < 26; i++) {
if(tmp.children[i] != null){
temp = i;
break;
}
}
return a||has(tmp.children[temp],word);
}
}
public boolean[] chkSubStr(String[] p, int n, String s) {
// write code here
Trie trie = new Trie();
trie.insert(s);
boolean[] res = new boolean[n];
for (int i = 0; i < n; i++) {
if(trie.has(trie,p[i])) res[i] = true;
}
return res;
}
}通用版本,实现了insert,search,startswith
public class Trie {
private final int ALPHABET_SIZE = 26;
private Trie[] children = new Trie[ALPHABET_SIZE];
boolean isEndOfWord = false;
public Trie() {}
public void insert(String word) {
Trie tmp = this;
for (char i : word.toCharArray()) {
if (tmp.children[i-'a'] == null) {
tmp.children[i-'a'] = new Trie();
}
tmp = tmp.children[i-'a'];
}
tmp.isEndOfWord = true;
}
public boolean search(String word) {
Trie tmp = this;
for (char i : word.toCharArray()) {
if (tmp.children[i-'a'] == null) {
return false;
}
tmp = tmp.children[i-'a'];
}
return tmp.isEndOfWord ? true : false;
}
public boolean startsWith(String prefix) {
Trie tmp = this;
for (char i : prefix.toCharArray()) {
if (tmp.children[i-'a'] == null) {
return false;
}
tmp = tmp.children[i-'a'];
}
return true;
}
}
京公网安备 11010502036488号