implementera en trie med insert
search
och startsWith
metoder.
exempel:
Trie trie = new Trie();trie.insert("apple");
trie.search("apple"); // returns true
trie.search("app"); // returns false
trie.startsWith("app"); // returns true
trie.insert("app");
trie.search("app"); // returns true
Obs:
- Du kan anta att alla ingångar består av små bokstäver
a-z
. - alla ingångar är garanterade att vara icke-tomma strängar.
detta är ett leetcode-problem:
lösning:
innan vi dyker in i att lösa detta problem kommer vi först att förstå vilken Trie-datastruktur som är i korthet.
en Trie är en ordnad trädstruktur som oftast används för att lagra sträng. Anledningen till att den används för att lagra sträng är att den har snabb hämtningstid. Komplexiteten att hitta en sträng i en försök är O (m), där m är strängens längd. Om vi har lagrat en miljon strängar i Trie och vi måste hitta en viss sträng, låt oss säga katt då blir dess komplexitet O(3), är det inte fantastiskt.
termen trie kom från ordet hämtning eftersom det gör hämtning av en sträng från samlingen av strängar mycket lätt. Trie kallas också som Prefix träd.
i Trie är roten Tom och varje barnnod innehåller bara ett tecken. Så antalet barnnoder, en viss nod kan ha beror på antalet alfabet på ett visst språk. Antag att vi använder vår trie för att lagra engelska ord, då kommer varje nod att ha 26 barnnoder.
i bilden ovan har vi bara visat 5 barnnoder men i själva roten kommer att ha 26 barnnoder, en för varje alfabet.
nu, låt oss se om vi behöver representera några strängar i trie datastruktur så hur det kommer att se ut. Antag att vi må te representera boll, skallig, bil, katt och hund i trie. Detta kommer att se ut som visas nedan. I bilden nedan betyder de orange noderna slutet på ordet.
2. Vi väljer första tecknet från cat dvs c. nu index i array kommer att vara 2. Om du inte är medveten hittar vi indexet för något alfabet i array genom att göra char-’a’. Genom att göra detta är indexet för a 0, b är 1, c är 2 och så vidare. Vi går till index 2 av array och tilldelar den en ny nod.
3. Nu flyttar vi vår pekare till andra noden. Så vi initierar index 0 till ny nod.
4. Vi flyttar pekaren till nästa nod. Nästa alfabet i cat är t. indexet för t är 19. Vi initierar index 19 till ny nod.
5. Vi flyttar till nästa nod . Nu finns inget mer alfabet kvar att infogas. Så vi markerar denna nod som slut.
nedan är Java-koden för insert-metoden.
public void insert(String str) {
char data = str.toCharArray();
TrieNode tempNode = root;
for (char c : data) {
int index = c - 'a';
if (tempNode.child == null) {
tempNode.child = new TrieNode();
}
tempNode = tempNode.child;
}
tempNode.isEnd = true;
}
nedan är den kompletta Java-lösningen för detta program med Sök-och startsWith-metoden.
class Trie {
class TrieNode {
static final int ALPHABET_SIZE = 26;
TrieNode child = new TrieNode; boolean isEnd;
}
TrieNode root;
/**
* Initialize your data structure here.
*/
public Trie() {
root = new TrieNode();
}
/**
* Inserts a word into the trie.
*/
public void insert(String str) {
char data = str.toCharArray();
TrieNode tempNode = root;
for (char c : data) {
int index = c - 'a';
if (tempNode.child == null) {
tempNode.child = new TrieNode();
}
tempNode = tempNode.child;
}
tempNode.isEnd = true;
}
/**
* Returns if the word is in the trie.
*/
public boolean search(String str) {
char data = str.toCharArray();
TrieNode tempNode = root;
for (char c : data) {
int index = c - 'a';
if (tempNode.child == null) {
return false;
}
tempNode = tempNode.child;
}
if (tempNode != null && tempNode.isEnd == false) {
return false;
}
return true;
}
/**
* Returns if there is any word in the trie that starts with the given prefix.
*/
public boolean startsWith(String str) {
char data = str.toCharArray();
TrieNode tempNode = root;
for (char c : data) {
int index = c - 'a';
if (tempNode.child == null) {
return false;
}
tempNode = tempNode.child;
}
return true;
}
}