From c7c3d8be6cf70eb5cc0a71d23a7cbc927465e01a Mon Sep 17 00:00:00 2001
From: tuhin
Date: Sat, 5 Oct 2024 21:46:21 +0530
Subject: [PATCH 01/21] feat : new algo uniquesubseqcount
---
.../UniqueSubsequencesCount.java | 53 +++++++++++++++++++
.../UniqueSubsequencesCountTest.java | 29 ++++++++++
2 files changed, 82 insertions(+)
create mode 100755 src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
create mode 100755 src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
new file mode 100755
index 000000000000..80e175148bec
--- /dev/null
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -0,0 +1,53 @@
+package com.thealgorithms.dynamicprogramming;
+
+// Program to find the number of Subsequences can be produced from a string
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+// Author -> https://github.com/Tuhinm2002
+
+public class UniqueSubsequencesCount {
+
+ private UniqueSubsequencesCount() {
+ throw new UnsupportedOperationException("Utility class");
+ }
+
+ public static int subseqCount(String str) {
+ int[] dp = new int[str.length() + 1];
+ for (int i : dp) {
+ Arrays.fill(dp, -1);
+ }
+ int ans = recursiveCall(str, 0, dp);
+ return ans;
+ }
+
+ public static int recursiveCall(String st, int idx, int[] dp) {
+
+ if (idx >= st.length()) {
+ return 0;
+ }
+
+ if (dp[idx] != -1) {
+ return dp[idx];
+ }
+
+ Set set = new HashSet<>();
+
+ int res = 0;
+
+ for (int j = idx; j < st.length(); j++) {
+
+ if (set.contains(st.charAt(j))) {
+ continue;
+ }
+
+ set.add(st.charAt(j));
+
+ res = 1 + recursiveCall(st, j + 1, dp) + res;
+ }
+
+ return dp[idx] = res;
+ }
+}
diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
new file mode 100755
index 000000000000..b1d822af5f3f
--- /dev/null
+++ b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
@@ -0,0 +1,29 @@
+package com.thealgorithms.dynamicprogramming;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class UniqueSubsequencesCountTest {
+
+ @Test
+ void subseqCountTestOne() {
+ String s = "abc";
+
+ assertEquals(7, UniqueSubsequencesCount.subseqCount(s));
+ }
+
+ @Test
+ void subseqCountTestTwo() {
+ String s = "abcdashgdhas";
+
+ assertEquals(3592, UniqueSubsequencesCount.subseqCount(s));
+ }
+
+ @Test
+ void subseqCountTestThree() {
+ String s = "aaaaa";
+
+ assertEquals(5, UniqueSubsequencesCount.subseqCount(s));
+ }
+}
From d12468003e4ac50a2bbf4886a67cf71a9bb4f2f1 Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Sat, 5 Oct 2024 21:50:22 +0530
Subject: [PATCH 02/21] Update UniqueSubsequencesCount.java
---
.../dynamicprogramming/UniqueSubsequencesCount.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
index 80e175148bec..099fbfae1e87 100755
--- a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -8,7 +8,7 @@
// Author -> https://github.com/Tuhinm2002
-public class UniqueSubsequencesCount {
+public final class UniqueSubsequencesCount {
private UniqueSubsequencesCount() {
throw new UnsupportedOperationException("Utility class");
From d99c476099152028cd682efe755194ec6ddab0fc Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Sat, 5 Oct 2024 21:50:34 +0530
Subject: [PATCH 03/21] Update UniqueSubsequencesCountTest.java
---
.../dynamicprogramming/UniqueSubsequencesCountTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
index b1d822af5f3f..171f2d28db8a 100755
--- a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
+++ b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
@@ -4,7 +4,7 @@
import org.junit.jupiter.api.Test;
-public class UniqueSubsequencesCountTest {
+public final class UniqueSubsequencesCountTest {
@Test
void subseqCountTestOne() {
From 33f06a876ec9533f11e4a57658c549b07baa53ca Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Sat, 5 Oct 2024 21:55:32 +0530
Subject: [PATCH 04/21] Update UniqueSubsequencesCount.java
---
.../dynamicprogramming/UniqueSubsequencesCount.java | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
index 099fbfae1e87..b3de7e17e7e4 100755
--- a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -14,13 +14,17 @@ private UniqueSubsequencesCount() {
throw new UnsupportedOperationException("Utility class");
}
+ private static int[] dp;
+
public static int subseqCount(String str) {
- int[] dp = new int[str.length() + 1];
+
+ dp = new int[str.length() + 1];
+
for (int i : dp) {
Arrays.fill(dp, -1);
}
- int ans = recursiveCall(str, 0, dp);
- return ans;
+
+ return recursiveCall(str, 0, dp);
}
public static int recursiveCall(String st, int idx, int[] dp) {
From 892e365fd8568b93a4669b3643a6086a8ead4b41 Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Sat, 5 Oct 2024 22:06:11 +0530
Subject: [PATCH 05/21] Update UniqueSubsequencesCount.java
---
.../dynamicprogramming/UniqueSubsequencesCount.java | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
index b3de7e17e7e4..d1b239d219cb 100755
--- a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -19,10 +19,7 @@ private UniqueSubsequencesCount() {
public static int subseqCount(String str) {
dp = new int[str.length() + 1];
-
- for (int i : dp) {
- Arrays.fill(dp, -1);
- }
+ Arrays.fill(dp, -1);
return recursiveCall(str, 0, dp);
}
From 78584432643405c12529163ddd5521d6c39cee55 Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Sat, 5 Oct 2024 22:13:10 +0530
Subject: [PATCH 06/21] Update UniqueSubsequencesCount.java
---
.../dynamicprogramming/UniqueSubsequencesCount.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
index d1b239d219cb..8ec4af937370 100755
--- a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -14,11 +14,11 @@ private UniqueSubsequencesCount() {
throw new UnsupportedOperationException("Utility class");
}
- private static int[] dp;
+ private static Set set = new HashSet<>();
public static int subseqCount(String str) {
- dp = new int[str.length() + 1];
+ int[] dp = new int[str.length() + 1];
Arrays.fill(dp, -1);
return recursiveCall(str, 0, dp);
@@ -34,7 +34,7 @@ public static int recursiveCall(String st, int idx, int[] dp) {
return dp[idx];
}
- Set set = new HashSet<>();
+ set = new HashSet<>();
int res = 0;
From 569cc1c83fbeacdabbd7ca0e075957bb03bc1aa2 Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Sat, 5 Oct 2024 22:17:19 +0530
Subject: [PATCH 07/21] Update UniqueSubsequencesCount.java
---
.../dynamicprogramming/UniqueSubsequencesCount.java | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
index 8ec4af937370..13967972ba15 100755
--- a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -14,8 +14,6 @@ private UniqueSubsequencesCount() {
throw new UnsupportedOperationException("Utility class");
}
- private static Set set = new HashSet<>();
-
public static int subseqCount(String str) {
int[] dp = new int[str.length() + 1];
@@ -34,7 +32,7 @@ public static int recursiveCall(String st, int idx, int[] dp) {
return dp[idx];
}
- set = new HashSet<>();
+ Set set = new HashSet<>();
int res = 0;
@@ -49,6 +47,7 @@ public static int recursiveCall(String st, int idx, int[] dp) {
res = 1 + recursiveCall(st, j + 1, dp) + res;
}
- return dp[idx] = res;
+ dp[idx] = res;
+ return dp[idx];
}
}
From 3b8d047bca62da2877b24477af64155bdc681e4a Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Mon, 7 Oct 2024 22:01:11 +0530
Subject: [PATCH 08/21] Update UniqueSubsequencesCount.java
---
.../UniqueSubsequencesCount.java | 53 +++++++++++++++++--
1 file changed, 49 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
index 13967972ba15..948454c9eb7b 100755
--- a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -1,52 +1,97 @@
package com.thealgorithms.dynamicprogramming;
-// Program to find the number of Subsequences can be produced from a string
-
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
-// Author -> https://github.com/Tuhinm2002
-
+/**
+ * Utility class to find the number of unique subsequences that can be
+ * produced from a given string.
+ *
+ * This class contains static methods to compute the unique subsequence count
+ * using dynamic programming and recursion. It ensures that duplicate characters
+ * are not counted multiple times in the subsequences.
+ *
+ * @author Author: https://github.com/Tuhinm2002
+ */
public final class UniqueSubsequencesCount {
+ /**
+ * Private constructor to prevent instantiation of this utility class.
+ * This class should only be used in a static context.
+ *
+ * @throws UnsupportedOperationException if attempted to instantiate.
+ */
private UniqueSubsequencesCount() {
throw new UnsupportedOperationException("Utility class");
}
+ /**
+ * Finds the number of unique subsequences that can be generated from
+ * the given string.
+ *
+ * This method initializes a dynamic programming (DP) array and invokes
+ * the recursive helper function to compute the subsequence count.
+ *
+ * @param str the input string from which subsequences are generated
+ * @return the total count of unique subsequences
+ */
public static int subseqCount(String str) {
+ // DP array initialized to store intermediate results
int[] dp = new int[str.length() + 1];
Arrays.fill(dp, -1);
+ // Calls the recursive function to compute the result
return recursiveCall(str, 0, dp);
}
+ /**
+ * Recursive helper function to count the number of unique subsequences
+ * starting from the given index.
+ *
+ * Uses a HashSet to avoid counting duplicate characters within
+ * a single subsequence.
+ *
+ * @param st the input string
+ * @param idx the current index from which to calculate subsequences
+ * @param dp dynamic programming array used to memoize results
+ * @return the total number of unique subsequences starting from the
+ * current index
+ */
public static int recursiveCall(String st, int idx, int[] dp) {
+ // Base case: when index exceeds the string length
if (idx >= st.length()) {
return 0;
}
+ // If result is already calculated, return the memoized value
if (dp[idx] != -1) {
return dp[idx];
}
+ // Set to store characters to avoid duplicates
Set set = new HashSet<>();
int res = 0;
+ // Iterate over the string starting from current index
for (int j = idx; j < st.length(); j++) {
+ // If character is already in the set, skip it
if (set.contains(st.charAt(j))) {
continue;
}
+ // Add character to set and recursively calculate subsequences
set.add(st.charAt(j));
+ // 1 for the current subsequence + recursive call for the rest of the string
res = 1 + recursiveCall(st, j + 1, dp) + res;
}
+ // Memoize the result
dp[idx] = res;
return dp[idx];
}
From 735077dbfbac5e1dc369e2f04c989e83df6dd13f Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Mon, 7 Oct 2024 22:08:07 +0530
Subject: [PATCH 09/21] Update UniqueSubsequencesCount.java
---
.../dynamicprogramming/UniqueSubsequencesCount.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
index 948454c9eb7b..2f427a750607 100755
--- a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -36,7 +36,7 @@ private UniqueSubsequencesCount() {
* @param str the input string from which subsequences are generated
* @return the total count of unique subsequences
*/
- public static int subseqCount(String str) {
+ public static int countSubsequences(String str) {
// DP array initialized to store intermediate results
int[] dp = new int[str.length() + 1];
From 8819fdb87825e4c85cdbb61a7e19f47162609d6e Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Mon, 7 Oct 2024 22:16:50 +0530
Subject: [PATCH 10/21] Update UniqueSubsequencesCountTest.java
---
.../UniqueSubsequencesCountTest.java | 36 ++++++++++++++++---
1 file changed, 31 insertions(+), 5 deletions(-)
diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
index 171f2d28db8a..c10431a0aef9 100755
--- a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
+++ b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
@@ -4,26 +4,52 @@
import org.junit.jupiter.api.Test;
-public final class UniqueSubsequencesCountTest {
+public class UniqueSubsequencesCountTest {
@Test
void subseqCountTestOne() {
String s = "abc";
- assertEquals(7, UniqueSubsequencesCount.subseqCount(s));
+ assertEquals(7, UniqueSubsequencesCount.countSubsequences(s));
}
@Test
void subseqCountTestTwo() {
String s = "abcdashgdhas";
- assertEquals(3592, UniqueSubsequencesCount.subseqCount(s));
+ assertEquals(3592, UniqueSubsequencesCount.countSubsequences(s));
}
@Test
void subseqCountTestThree() {
- String s = "aaaaa";
+ String s = "a";
- assertEquals(5, UniqueSubsequencesCount.subseqCount(s));
+ assertEquals(1, UniqueSubsequencesCount.countSubsequences(s));
+ }
+
+ @Test
+ void subseqCountTestFour() {
+ String s = "a b";
+
+ assertEquals(7, UniqueSubsequencesCount.countSubsequences(s));
+ }
+
+ @Test
+ void subseqCountTestFive() {
+ String s = "a1b2";
+
+ assertEquals(15, UniqueSubsequencesCount.countSubsequences(s));
+ }
+
+ @Test
+ void subseqCountTesSix() {
+ String s = "AaBb";
+ assertEquals(15, UniqueSubsequencesCount.countSubsequences(s));
+ }
+
+ @Test
+ void subseqCountTesSeven() {
+ String s = "abab";
+ assertEquals(11, UniqueSubsequencesCount.countSubsequences(s));
}
}
From ed36d8ab80f2f78306f9037e669681c38ee79041 Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Mon, 7 Oct 2024 22:28:28 +0530
Subject: [PATCH 11/21] Update UniqueSubsequencesCount.java
---
.../dynamicprogramming/UniqueSubsequencesCount.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
index 2f427a750607..a292f942f3e4 100755
--- a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -12,7 +12,7 @@
* using dynamic programming and recursion. It ensures that duplicate characters
* are not counted multiple times in the subsequences.
*
- * @author Author: https://github.com/Tuhinm2002
+ * Author: https://github.com/Tuhinm2002
*/
public final class UniqueSubsequencesCount {
From 697c1086ce133b1ab970872f5d62b699bdd85e03 Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Tue, 8 Oct 2024 01:16:00 +0530
Subject: [PATCH 12/21] Update UniqueSubsequencesCountTest.java
---
.../UniqueSubsequencesCountTest.java | 52 +++----------------
1 file changed, 6 insertions(+), 46 deletions(-)
diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
index c10431a0aef9..76bb061d298b 100755
--- a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
+++ b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
@@ -2,54 +2,14 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
public class UniqueSubsequencesCountTest {
- @Test
- void subseqCountTestOne() {
- String s = "abc";
-
- assertEquals(7, UniqueSubsequencesCount.countSubsequences(s));
- }
-
- @Test
- void subseqCountTestTwo() {
- String s = "abcdashgdhas";
-
- assertEquals(3592, UniqueSubsequencesCount.countSubsequences(s));
- }
-
- @Test
- void subseqCountTestThree() {
- String s = "a";
-
- assertEquals(1, UniqueSubsequencesCount.countSubsequences(s));
- }
-
- @Test
- void subseqCountTestFour() {
- String s = "a b";
-
- assertEquals(7, UniqueSubsequencesCount.countSubsequences(s));
- }
-
- @Test
- void subseqCountTestFive() {
- String s = "a1b2";
-
- assertEquals(15, UniqueSubsequencesCount.countSubsequences(s));
- }
-
- @Test
- void subseqCountTesSix() {
- String s = "AaBb";
- assertEquals(15, UniqueSubsequencesCount.countSubsequences(s));
- }
-
- @Test
- void subseqCountTesSeven() {
- String s = "abab";
- assertEquals(11, UniqueSubsequencesCount.countSubsequences(s));
+ @ParameterizedTest
+ @CsvSource({"abc, 7", "abcdashgdhas, 3592", "a, 1", "'a b', 7", "a1b2, 15", "AaBb, 15", "abab, 11"})
+ private void subseqCountParameterizedTest(String input, int expected) {
+ assertEquals(expected, UniqueSubsequencesCount.countSubsequences(input));
}
}
From 002d55f224522abf8f094e8deede21c18f0fd29f Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Tue, 8 Oct 2024 01:17:49 +0530
Subject: [PATCH 13/21] Update UniqueSubsequencesCount.java
---
.../dynamicprogramming/UniqueSubsequencesCount.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
index a292f942f3e4..8c7ea6179e3f 100755
--- a/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
+++ b/src/main/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCount.java
@@ -36,14 +36,14 @@ private UniqueSubsequencesCount() {
* @param str the input string from which subsequences are generated
* @return the total count of unique subsequences
*/
- public static int countSubsequences(String str) {
+ public static int countSubseq(String str) {
// DP array initialized to store intermediate results
int[] dp = new int[str.length() + 1];
Arrays.fill(dp, -1);
// Calls the recursive function to compute the result
- return recursiveCall(str, 0, dp);
+ return countSubsequences(str, 0, dp);
}
/**
@@ -59,7 +59,7 @@ public static int countSubsequences(String str) {
* @return the total number of unique subsequences starting from the
* current index
*/
- public static int recursiveCall(String st, int idx, int[] dp) {
+ public static int countSubsequences(String st, int idx, int[] dp) {
// Base case: when index exceeds the string length
if (idx >= st.length()) {
@@ -88,7 +88,7 @@ public static int recursiveCall(String st, int idx, int[] dp) {
set.add(st.charAt(j));
// 1 for the current subsequence + recursive call for the rest of the string
- res = 1 + recursiveCall(st, j + 1, dp) + res;
+ res = 1 + countSubsequences(st, j + 1, dp) + res;
}
// Memoize the result
From 1536eeb29e1c7f210375e8f6d64d4cecf94aed5d Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Tue, 8 Oct 2024 01:18:07 +0530
Subject: [PATCH 14/21] Update UniqueSubsequencesCountTest.java
---
.../dynamicprogramming/UniqueSubsequencesCountTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
index 76bb061d298b..5f78cd8b3008 100755
--- a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
+++ b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
@@ -10,6 +10,6 @@ public class UniqueSubsequencesCountTest {
@ParameterizedTest
@CsvSource({"abc, 7", "abcdashgdhas, 3592", "a, 1", "'a b', 7", "a1b2, 15", "AaBb, 15", "abab, 11"})
private void subseqCountParameterizedTest(String input, int expected) {
- assertEquals(expected, UniqueSubsequencesCount.countSubsequences(input));
+ assertEquals(expected, UniqueSubsequencesCount.countSubseq(input));
}
}
From 5288a5a68dc65a0d17bed4adcb8aee26ade99b56 Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Tue, 8 Oct 2024 01:23:43 +0530
Subject: [PATCH 15/21] Update UniqueSubsequencesCountTest.java
From 827b4d2df5daf53b70061a9b37aa28c8c90534f0 Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Tue, 8 Oct 2024 01:26:51 +0530
Subject: [PATCH 16/21] Update UniqueSubsequencesCountTest.java
---
.../dynamicprogramming/UniqueSubsequencesCountTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
index 5f78cd8b3008..049804f58b5a 100755
--- a/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
+++ b/src/test/java/com/thealgorithms/dynamicprogramming/UniqueSubsequencesCountTest.java
@@ -9,7 +9,7 @@ public class UniqueSubsequencesCountTest {
@ParameterizedTest
@CsvSource({"abc, 7", "abcdashgdhas, 3592", "a, 1", "'a b', 7", "a1b2, 15", "AaBb, 15", "abab, 11"})
- private void subseqCountParameterizedTest(String input, int expected) {
+ void subseqCountParameterizedTest(String input, int expected) {
assertEquals(expected, UniqueSubsequencesCount.countSubseq(input));
}
}
From 574fcf4e27c5b4a4597b7fb26b84f59b177e1f10 Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Tue, 8 Oct 2024 10:32:16 +0530
Subject: [PATCH 17/21] Update UniqueSubsequencesCount.java
From 2553434dcab1afd195681feb0858719bb189f78c Mon Sep 17 00:00:00 2001
From: tuhin
Date: Thu, 10 Oct 2024 02:15:37 +0530
Subject: [PATCH 18/21] feat : new bitmanipulation algo
---
.../bitmanipulation/SingleElement.java | 39 +++++++++++++++++++
.../bitmanipulation/SingleElementTest.java | 33 ++++++++++++++++
2 files changed, 72 insertions(+)
create mode 100644 src/main/java/com/thealgorithms/bitmanipulation/SingleElement.java
create mode 100644 src/test/java/com/thealgorithms/bitmanipulation/SingleElementTest.java
diff --git a/src/main/java/com/thealgorithms/bitmanipulation/SingleElement.java b/src/main/java/com/thealgorithms/bitmanipulation/SingleElement.java
new file mode 100644
index 000000000000..85ebdf02db25
--- /dev/null
+++ b/src/main/java/com/thealgorithms/bitmanipulation/SingleElement.java
@@ -0,0 +1,39 @@
+package com.thealgorithms.bitmanipulation;
+
+/**
+ * Utility class to find the single non-duplicate element from an array
+ * where all other elements appear twice.
+ *
+ * The algorithm runs in O(n) time complexity and O(1) space complexity
+ * using bitwise XOR.
+ *
+ *
+ * @author Tuhin M
+ */
+public final class SingleElement {
+
+ /**
+ * Private constructor to prevent instantiation of this utility class.
+ * Throws an UnsupportedOperationException if attempted.
+ */
+ private SingleElement() {
+ throw new UnsupportedOperationException("Utility Class");
+ }
+
+ /**
+ * Finds the single non-duplicate element in an array where every other
+ * element appears exactly twice. Uses bitwise XOR to achieve O(n) time
+ * complexity and O(1) space complexity.
+ *
+ * @param arr the input array containing integers where every element
+ * except one appears exactly twice
+ * @return the single non-duplicate element
+ */
+ public static int findSingleElement(int[] arr) {
+ int ele = 0;
+ for (int i = 0; i < arr.length; i++) {
+ ele ^= arr[i];
+ }
+ return ele;
+ }
+}
diff --git a/src/test/java/com/thealgorithms/bitmanipulation/SingleElementTest.java b/src/test/java/com/thealgorithms/bitmanipulation/SingleElementTest.java
new file mode 100644
index 000000000000..2e2afe99b0da
--- /dev/null
+++ b/src/test/java/com/thealgorithms/bitmanipulation/SingleElementTest.java
@@ -0,0 +1,33 @@
+package com.thealgorithms.bitmanipulation;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.stream.Stream;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+public final class SingleElementTest {
+
+ /**
+ * Parameterized test to find the single non-duplicate element
+ * in the given arrays.
+ *
+ * @param arr the input array where every element appears twice except one
+ * @param expected the expected single element result
+ */
+ @ParameterizedTest
+ @MethodSource("provideTestCases")
+ void testFindSingleElement(int[] arr, int expected) {
+ assertEquals(expected, SingleElement.findSingleElement(arr));
+ }
+
+ /**
+ * Provides test cases for the parameterized test.
+ *
+ * @return Stream of arguments consisting of arrays and expected results
+ */
+ private static Stream provideTestCases() {
+ return Stream.of(Arguments.of(new int[] {1, 1, 2, 2, 4, 4, 3}, 3), Arguments.of(new int[] {1, 2, 2, 3, 3}, 1), Arguments.of(new int[] {10}, 10));
+ }
+}
From f51b11b024c861f51c8672de802290f9321998d4 Mon Sep 17 00:00:00 2001
From: tuhin
Date: Sat, 12 Oct 2024 13:41:15 +0530
Subject: [PATCH 19/21] feat : new bit algo
---
.../bitmanipulation/FindNthBit.java | 46 +++++++++++++++++++
.../bitmanipulation/FindNthBitTest.java | 39 ++++++++++++++++
2 files changed, 85 insertions(+)
create mode 100644 src/main/java/com/thealgorithms/bitmanipulation/FindNthBit.java
create mode 100644 src/test/java/com/thealgorithms/bitmanipulation/FindNthBitTest.java
diff --git a/src/main/java/com/thealgorithms/bitmanipulation/FindNthBit.java b/src/main/java/com/thealgorithms/bitmanipulation/FindNthBit.java
new file mode 100644
index 000000000000..cf647267035c
--- /dev/null
+++ b/src/main/java/com/thealgorithms/bitmanipulation/FindNthBit.java
@@ -0,0 +1,46 @@
+package com.thealgorithms.bitmanipulation;
+
+/**
+ * A utility class to find the Nth bit of a given number.
+ *
+ * This class provides a method to extract the value of the Nth bit (either 0 or 1)
+ * from the binary representation of a given integer.
+ *
+ *
Example:
+ *
{@code
+ * int result = FindNthBit.findNthBit(5, 2); // returns 0 as the 2nd bit of 5 (binary 101) is 0.
+ * }
+ *
+ * Author: Tuhinm2002
+ */
+public final class FindNthBit {
+
+ /**
+ * Private constructor to prevent instantiation.
+ *
+ *
This is a utility class, and it should not be instantiated.
+ * Attempting to instantiate this class will throw an UnsupportedOperationException.
+ */
+ private FindNthBit() {
+ throw new UnsupportedOperationException("Utility class");
+ }
+
+ /**
+ * Finds the value of the Nth bit of the given number.
+ *
+ *
This method uses bitwise operations to extract the Nth bit from the
+ * binary representation of the given integer.
+ *
+ * @param num the integer number whose Nth bit is to be found
+ * @param n the bit position (1-based) to retrieve
+ * @return the value of the Nth bit (0 or 1)
+ * @throws IllegalArgumentException if the bit position is less than 1
+ */
+ public static int findNthBit(int num, int n) {
+ if (n < 1) {
+ throw new IllegalArgumentException("Bit position must be greater than or equal to 1.");
+ }
+ // Shifting the number to the right by (n - 1) positions and checking the last bit
+ return ((num & (1 << (n - 1))) >> (n - 1));
+ }
+}
diff --git a/src/test/java/com/thealgorithms/bitmanipulation/FindNthBitTest.java b/src/test/java/com/thealgorithms/bitmanipulation/FindNthBitTest.java
new file mode 100644
index 000000000000..2eb9555eb4a8
--- /dev/null
+++ b/src/test/java/com/thealgorithms/bitmanipulation/FindNthBitTest.java
@@ -0,0 +1,39 @@
+package com.thealgorithms.bitmanipulation;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.stream.Stream;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+public final class FindNthBitTest {
+
+ /**
+ * A parameterized test that checks the value of the Nth bit for different inputs.
+ *
+ * @param num the number whose Nth bit is being tested
+ * @param n the bit position
+ * @param expected the expected value of the Nth bit (0 or 1)
+ */
+ @ParameterizedTest
+ @MethodSource("provideTestCases")
+ void findNthBitParameterizedTest(int num, int n, int expected) {
+ assertEquals(expected, FindNthBit.findNthBit(num, n));
+ }
+
+ /**
+ * Provides the test cases as a stream of arguments for the parameterized test.
+ *
+ * @return a stream of test cases where each case consists of a number, the bit position,
+ * and the expected result.
+ */
+ private static Stream provideTestCases() {
+ return Stream.of(Arguments.of(13, 2, 0), // binary: 1101, 2nd bit is 0
+ Arguments.of(13, 3, 1), // binary: 1101, 3rd bit is 1
+ Arguments.of(4, 2, 0), // binary: 100, 2nd bit is 0
+ Arguments.of(4, 3, 1), // binary: 100, 3rd bit is 1
+ Arguments.of(1, 1, 1) // binary: 1, 1st bit is 1
+ );
+ }
+}
From 4242f28f8dfd5159d8eff75e0473ab8a9f70cade Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Sat, 12 Oct 2024 13:46:32 +0530
Subject: [PATCH 20/21] Update FindNthBitTest.java
---
.../com/thealgorithms/bitmanipulation/FindNthBitTest.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/test/java/com/thealgorithms/bitmanipulation/FindNthBitTest.java b/src/test/java/com/thealgorithms/bitmanipulation/FindNthBitTest.java
index 2eb9555eb4a8..978003d21358 100644
--- a/src/test/java/com/thealgorithms/bitmanipulation/FindNthBitTest.java
+++ b/src/test/java/com/thealgorithms/bitmanipulation/FindNthBitTest.java
@@ -30,10 +30,10 @@ void findNthBitParameterizedTest(int num, int n, int expected) {
*/
private static Stream provideTestCases() {
return Stream.of(Arguments.of(13, 2, 0), // binary: 1101, 2nd bit is 0
- Arguments.of(13, 3, 1), // binary: 1101, 3rd bit is 1
- Arguments.of(4, 2, 0), // binary: 100, 2nd bit is 0
- Arguments.of(4, 3, 1), // binary: 100, 3rd bit is 1
- Arguments.of(1, 1, 1) // binary: 1, 1st bit is 1
+ Arguments.of(13, 3, 1), // binary: 1101, 3rd bit is 1
+ Arguments.of(4, 2, 0), // binary: 100, 2nd bit is 0
+ Arguments.of(4, 3, 1), // binary: 100, 3rd bit is 1
+ Arguments.of(1, 1, 1) // binary: 1, 1st bit is 1
);
}
}
From 05280abb8d03e4808e0b677ed33591461e45b4ad Mon Sep 17 00:00:00 2001
From: Tuhinm2002 <75078694+Tuhinm2002@users.noreply.github.com>
Date: Sat, 12 Oct 2024 13:53:41 +0530
Subject: [PATCH 21/21] Update FindNthBit.java
---
src/main/java/com/thealgorithms/bitmanipulation/FindNthBit.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/thealgorithms/bitmanipulation/FindNthBit.java b/src/main/java/com/thealgorithms/bitmanipulation/FindNthBit.java
index cf647267035c..7a35fc3feebf 100644
--- a/src/main/java/com/thealgorithms/bitmanipulation/FindNthBit.java
+++ b/src/main/java/com/thealgorithms/bitmanipulation/FindNthBit.java
@@ -41,6 +41,6 @@ public static int findNthBit(int num, int n) {
throw new IllegalArgumentException("Bit position must be greater than or equal to 1.");
}
// Shifting the number to the right by (n - 1) positions and checking the last bit
- return ((num & (1 << (n - 1))) >> (n - 1));
+ return (num & (1 << (n - 1))) >> (n - 1);
}
}