From 1cc99205cf4beceb7e645360287fada1a999fb19 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 11:46:56 +0530 Subject: [PATCH 01/11] feat: add Trie class --- .../java/com/thealgorithms/tries/Trie.java | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 src/main/java/com/thealgorithms/tries/Trie.java diff --git a/src/main/java/com/thealgorithms/tries/Trie.java b/src/main/java/com/thealgorithms/tries/Trie.java new file mode 100644 index 000000000000..e45b17e72400 --- /dev/null +++ b/src/main/java/com/thealgorithms/tries/Trie.java @@ -0,0 +1,121 @@ +package com.thealgorithms.tries; + +/** + * TrieNode class which holds the lowercase letter and references to its child nodes + */ +class TrieNode { + private static final int CHILDREN_NODE_COUNT = 26; + + private TrieNode[] children; + private char letter; + private boolean end; + + public TrieNode(char letter) { + this.letter = letter; + this.children = new TrieNode[CHILDREN_NODE_COUNT]; + this.end = false; + } + + public TrieNode[] getChildren() { + return children; + } + + public void setChildren(TrieNode[] children) { + this.children = children; + } + + public char getLetter() { + return letter; + } + + public void setLetter(char letter) { + this.letter = letter; + } + + public boolean isEnd() { + return end; + } + + public void setEnd(boolean end) { + this.end = end; + } +} + +/** + * Trie class which holds Strings of LowerCase Sensitive characters. + */ +public class Trie { + private static final char ROOT_CHAR = '*'; + private static final char BASE_CHAR = 'a'; + + private final TrieNode root; + + public Trie() { + this.root = new TrieNode(ROOT_CHAR); + } + + /** + * Inserts the word into Trie + * + * @param word + */ + public void insert(String word) { + TrieNode head = root; + + for (int i = 0; i < word.length(); i++) { + char c = word.charAt(i); + + if (head.getChildren()[c - BASE_CHAR] == null) { + head.getChildren()[c - BASE_CHAR] = new TrieNode(c); + } + + head = head.getChildren()[c - BASE_CHAR]; + } + + head.setEnd(true); + } + + /** + * Searches in the Trie if a word exists or not. + * + * @param word + * @return true / false + */ + public boolean search(String word) { + TrieNode head = root; + + for (int i = 0; i < word.length(); i++) { + char c = word.charAt(i); + + if (head.getChildren()[c - BASE_CHAR] == null) { + return false; + } + + head = head.getChildren()[c - BASE_CHAR]; + } + + return head.isEnd(); + } + + /** + * Searches in the Trie if a prefix exists or not. + * + * @param prefix + * @return true / false + */ + public boolean startsWith(String prefix) { + TrieNode head = root; + + for (int i = 0; i < prefix.length(); i++) { + char c = prefix.charAt(i); + + if (head.getChildren()[c - BASE_CHAR] == null) { + return false; + } + + head = head.getChildren()[c - BASE_CHAR]; + } + + return true; + } +} From f0e3f952c7f4dd33c0d3f0a17a0441ca7183f1a6 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 11:55:12 +0530 Subject: [PATCH 02/11] feat: fix linting issues --- src/main/java/com/thealgorithms/tries/Trie.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/thealgorithms/tries/Trie.java b/src/main/java/com/thealgorithms/tries/Trie.java index e45b17e72400..90c5b277b66a 100644 --- a/src/main/java/com/thealgorithms/tries/Trie.java +++ b/src/main/java/com/thealgorithms/tries/Trie.java @@ -5,7 +5,7 @@ */ class TrieNode { private static final int CHILDREN_NODE_COUNT = 26; - + private TrieNode[] children; private char letter; private boolean end; @@ -61,7 +61,7 @@ public Trie() { */ public void insert(String word) { TrieNode head = root; - + for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); @@ -83,7 +83,7 @@ public void insert(String word) { */ public boolean search(String word) { TrieNode head = root; - + for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); From 26d8bdd5adb1216d0160c8224af5e4c2ac0dd482 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 11:57:38 +0530 Subject: [PATCH 03/11] feat: add author and wiki link --- src/main/java/com/thealgorithms/tries/Trie.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/thealgorithms/tries/Trie.java b/src/main/java/com/thealgorithms/tries/Trie.java index 90c5b277b66a..76d3e6b2b538 100644 --- a/src/main/java/com/thealgorithms/tries/Trie.java +++ b/src/main/java/com/thealgorithms/tries/Trie.java @@ -43,6 +43,9 @@ public void setEnd(boolean end) { /** * Trie class which holds Strings of LowerCase Sensitive characters. + * Wikipedia + * + * @author Sailok Chinta */ public class Trie { private static final char ROOT_CHAR = '*'; From 6215b670a89e25a1ff8c42d406f5a14360b75763 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 12:09:30 +0530 Subject: [PATCH 04/11] feat: add test cases --- .../com/thealgorithms/tries/TrieTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/test/java/com/thealgorithms/tries/TrieTest.java diff --git a/src/test/java/com/thealgorithms/tries/TrieTest.java b/src/test/java/com/thealgorithms/tries/TrieTest.java new file mode 100644 index 000000000000..0a2fce5eb293 --- /dev/null +++ b/src/test/java/com/thealgorithms/tries/TrieTest.java @@ -0,0 +1,36 @@ +package com.thealgorithms.tries; + +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TrieTest { + private static List WORDS = List.of("apple", "app", "rest", "rent", "rental"); + + @Test + void searchInTrie_success() { + Trie trie = new Trie(); + + for (String word : WORDS) { + trie.insert(word); + } + + Assertions.assertTrue(trie.search("app")); + Assertions.assertTrue(trie.search("apple")); + Assertions.assertFalse(trie.search("apply")); + } + + @Test + void startsWithPrefixInTrie_success() { + Trie trie = new Trie(); + + for (String word : WORDS) { + trie.insert(word); + } + + Assertions.assertTrue(trie.startsWith("app")); + Assertions.assertTrue(trie.startsWith("re")); + Assertions.assertTrue(trie.startsWith("rent")); + Assertions.assertFalse(trie.startsWith("bike")); + } +} From 24193468ef1c701d8f5abe502c022d1847fbddab Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 12:15:51 +0530 Subject: [PATCH 05/11] feat: fix checkstyle issues --- src/main/java/com/thealgorithms/tries/Trie.java | 2 +- src/test/java/com/thealgorithms/tries/TrieTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/thealgorithms/tries/Trie.java b/src/main/java/com/thealgorithms/tries/Trie.java index 76d3e6b2b538..f3e6bcdb39cc 100644 --- a/src/main/java/com/thealgorithms/tries/Trie.java +++ b/src/main/java/com/thealgorithms/tries/Trie.java @@ -10,7 +10,7 @@ class TrieNode { private char letter; private boolean end; - public TrieNode(char letter) { + TrieNode(char letter) { this.letter = letter; this.children = new TrieNode[CHILDREN_NODE_COUNT]; this.end = false; diff --git a/src/test/java/com/thealgorithms/tries/TrieTest.java b/src/test/java/com/thealgorithms/tries/TrieTest.java index 0a2fce5eb293..5448cdb9f9f1 100644 --- a/src/test/java/com/thealgorithms/tries/TrieTest.java +++ b/src/test/java/com/thealgorithms/tries/TrieTest.java @@ -5,10 +5,10 @@ import org.junit.jupiter.api.Test; public class TrieTest { - private static List WORDS = List.of("apple", "app", "rest", "rent", "rental"); + private static final List WORDS = List.of("apple", "app", "rest", "rent", "rental"); @Test - void searchInTrie_success() { + void searchInTrieSuccess() { Trie trie = new Trie(); for (String word : WORDS) { @@ -21,7 +21,7 @@ void searchInTrie_success() { } @Test - void startsWithPrefixInTrie_success() { + void startsWithPrefixInTrieSuccess() { Trie trie = new Trie(); for (String word : WORDS) { From 2cd862b202c85bbca1ddaec4fedb902274e36af7 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 12:23:51 +0530 Subject: [PATCH 06/11] feat: extend Trie Class to have more characters --- .../java/com/thealgorithms/tries/Trie.java | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/thealgorithms/tries/Trie.java b/src/main/java/com/thealgorithms/tries/Trie.java index f3e6bcdb39cc..88cc76f79119 100644 --- a/src/main/java/com/thealgorithms/tries/Trie.java +++ b/src/main/java/com/thealgorithms/tries/Trie.java @@ -1,26 +1,27 @@ package com.thealgorithms.tries; +import java.util.HashMap; +import java.util.Map; + /** - * TrieNode class which holds the lowercase letter and references to its child nodes + * TrieNode class which holds the characters and references to its child nodes */ class TrieNode { - private static final int CHILDREN_NODE_COUNT = 26; - - private TrieNode[] children; + private Map children; private char letter; private boolean end; TrieNode(char letter) { this.letter = letter; - this.children = new TrieNode[CHILDREN_NODE_COUNT]; + this.children = new HashMap<>(); this.end = false; } - public TrieNode[] getChildren() { + public Map getChildren() { return children; } - public void setChildren(TrieNode[] children) { + public void setChildren(Map children) { this.children = children; } @@ -42,14 +43,14 @@ public void setEnd(boolean end) { } /** - * Trie class which holds Strings of LowerCase Sensitive characters. + * Trie class which holds Strings of characters. + * * Wikipedia * - * @author Sailok Chinta + * @author Sailok Chinta */ public class Trie { private static final char ROOT_CHAR = '*'; - private static final char BASE_CHAR = 'a'; private final TrieNode root; @@ -68,11 +69,11 @@ public void insert(String word) { for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); - if (head.getChildren()[c - BASE_CHAR] == null) { - head.getChildren()[c - BASE_CHAR] = new TrieNode(c); + if (!head.getChildren().containsKey(c)) { + head.getChildren().put(c, new TrieNode(c)); } - head = head.getChildren()[c - BASE_CHAR]; + head = head.getChildren().get(c); } head.setEnd(true); @@ -90,11 +91,11 @@ public boolean search(String word) { for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); - if (head.getChildren()[c - BASE_CHAR] == null) { + if (!head.getChildren().containsKey(c)) { return false; } - head = head.getChildren()[c - BASE_CHAR]; + head = head.getChildren().get(c); } return head.isEnd(); @@ -112,11 +113,11 @@ public boolean startsWith(String prefix) { for (int i = 0; i < prefix.length(); i++) { char c = prefix.charAt(i); - if (head.getChildren()[c - BASE_CHAR] == null) { + if (!head.getChildren().containsKey(c)) { return false; } - head = head.getChildren()[c - BASE_CHAR]; + head = head.getChildren().get(c); } return true; From ab961b79d24df200132b20545a8bfa34a13be7e6 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 12:27:17 +0530 Subject: [PATCH 07/11] feat: move Trie to datastructures subfolder --- .../{ => datastructures}/tries/Trie.java | 44 +---------------- .../datastructures/tries/TrieNode.java | 47 +++++++++++++++++++ .../{ => datastructures}/tries/TrieTest.java | 4 +- 3 files changed, 51 insertions(+), 44 deletions(-) rename src/main/java/com/thealgorithms/{ => datastructures}/tries/Trie.java (67%) create mode 100644 src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java rename src/test/java/com/thealgorithms/{ => datastructures}/tries/TrieTest.java (90%) diff --git a/src/main/java/com/thealgorithms/tries/Trie.java b/src/main/java/com/thealgorithms/datastructures/tries/Trie.java similarity index 67% rename from src/main/java/com/thealgorithms/tries/Trie.java rename to src/main/java/com/thealgorithms/datastructures/tries/Trie.java index 88cc76f79119..b6d5ed6afeb4 100644 --- a/src/main/java/com/thealgorithms/tries/Trie.java +++ b/src/main/java/com/thealgorithms/datastructures/tries/Trie.java @@ -1,46 +1,4 @@ -package com.thealgorithms.tries; - -import java.util.HashMap; -import java.util.Map; - -/** - * TrieNode class which holds the characters and references to its child nodes - */ -class TrieNode { - private Map children; - private char letter; - private boolean end; - - TrieNode(char letter) { - this.letter = letter; - this.children = new HashMap<>(); - this.end = false; - } - - public Map getChildren() { - return children; - } - - public void setChildren(Map children) { - this.children = children; - } - - public char getLetter() { - return letter; - } - - public void setLetter(char letter) { - this.letter = letter; - } - - public boolean isEnd() { - return end; - } - - public void setEnd(boolean end) { - this.end = end; - } -} +package com.thealgorithms.datastructures.tries; /** * Trie class which holds Strings of characters. diff --git a/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java b/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java new file mode 100644 index 000000000000..aa10da485637 --- /dev/null +++ b/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java @@ -0,0 +1,47 @@ +package com.thealgorithms.datastructures.tries; + +import java.util.HashMap; +import java.util.Map; + +/** + * TrieNode class which holds the characters and references to its child nodes + * + * Wikipedia + * + * @author Sailok Chinta + */ +public class TrieNode { + private Map children; + private char letter; + private boolean end; + + public TrieNode(char letter) { + this.letter = letter; + this.children = new HashMap<>(); + this.end = false; + } + + public Map getChildren() { + return children; + } + + public void setChildren(Map children) { + this.children = children; + } + + public char getLetter() { + return letter; + } + + public void setLetter(char letter) { + this.letter = letter; + } + + public boolean isEnd() { + return end; + } + + public void setEnd(boolean end) { + this.end = end; + } +} diff --git a/src/test/java/com/thealgorithms/tries/TrieTest.java b/src/test/java/com/thealgorithms/datastructures/tries/TrieTest.java similarity index 90% rename from src/test/java/com/thealgorithms/tries/TrieTest.java rename to src/test/java/com/thealgorithms/datastructures/tries/TrieTest.java index 5448cdb9f9f1..3e5a31060ecf 100644 --- a/src/test/java/com/thealgorithms/tries/TrieTest.java +++ b/src/test/java/com/thealgorithms/datastructures/tries/TrieTest.java @@ -1,6 +1,8 @@ -package com.thealgorithms.tries; +package com.thealgorithms.datastructures.tries; import java.util.List; + +import com.thealgorithms.datastructures.tries.Trie; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; From 5e2a050c11a58d14b441540b2aebe5c2b98ca0a6 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 12:31:10 +0530 Subject: [PATCH 08/11] feat: fix linting issues --- .../java/com/thealgorithms/datastructures/tries/TrieTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/com/thealgorithms/datastructures/tries/TrieTest.java b/src/test/java/com/thealgorithms/datastructures/tries/TrieTest.java index 3e5a31060ecf..27e530330987 100644 --- a/src/test/java/com/thealgorithms/datastructures/tries/TrieTest.java +++ b/src/test/java/com/thealgorithms/datastructures/tries/TrieTest.java @@ -1,8 +1,6 @@ package com.thealgorithms.datastructures.tries; import java.util.List; - -import com.thealgorithms.datastructures.tries.Trie; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; From ee4d088924ed6adec916e3c49de9e37dde5a7359 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 13:19:54 +0530 Subject: [PATCH 09/11] feat: fix naming convention --- .../datastructures/tries/TrieNode.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java b/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java index aa10da485637..03f38e9f61b8 100644 --- a/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java +++ b/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java @@ -12,11 +12,11 @@ */ public class TrieNode { private Map children; - private char letter; + private char value; private boolean end; - public TrieNode(char letter) { - this.letter = letter; + public TrieNode(char value) { + this.value = value; this.children = new HashMap<>(); this.end = false; } @@ -29,12 +29,12 @@ public void setChildren(Map children) { this.children = children; } - public char getLetter() { - return letter; + public char getValue() { + return value; } - public void setLetter(char letter) { - this.letter = letter; + public void setValue(char value) { + this.value = value; } public boolean isEnd() { From da64677e55710f9679d3c0c5c821a044c08c43b9 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Tue, 1 Oct 2024 13:25:54 +0530 Subject: [PATCH 10/11] feat: remove unused methods for test coverage --- .../java/com/thealgorithms/datastructures/tries/TrieNode.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java b/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java index 03f38e9f61b8..aa4154162dd1 100644 --- a/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java +++ b/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java @@ -25,6 +25,7 @@ public Map getChildren() { return children; } + /* public void setChildren(Map children) { this.children = children; } @@ -36,6 +37,7 @@ public char getValue() { public void setValue(char value) { this.value = value; } + */ public boolean isEnd() { return end; From c960b1e0590a5dbd47c92d28c57b59e55d09f3c5 Mon Sep 17 00:00:00 2001 From: "sailok.chinta" Date: Wed, 2 Oct 2024 09:19:40 +0530 Subject: [PATCH 11/11] feat: fix pmd issue --- .../java/com/thealgorithms/datastructures/tries/TrieNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java b/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java index aa4154162dd1..0d8ee1f8ead1 100644 --- a/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java +++ b/src/main/java/com/thealgorithms/datastructures/tries/TrieNode.java @@ -29,6 +29,7 @@ public Map getChildren() { public void setChildren(Map children) { this.children = children; } + */ public char getValue() { return value; @@ -37,7 +38,6 @@ public char getValue() { public void setValue(char value) { this.value = value; } - */ public boolean isEnd() { return end;