diff --git a/src/main/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/Solution.java b/src/main/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/Solution.java index ae6622d..ff3d2a0 100644 --- a/src/main/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/Solution.java +++ b/src/main/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/Solution.java @@ -3,7 +3,7 @@ /** * Solution for the Minimum Deletions to Make String Balanced problem. * - *
Uses a split-point counting approach to compute minimum deletions in constant space. + *
Optimizes {@code SolutionDp} by collapsing the DP table into a single variable. * *
O(n)
@@ -11,27 +11,16 @@
* Flips the memoized recursion into an iterative DP table. + *
Iterative DP table tracking minimum deletions at each position. * *
O(n)
@@ -17,9 +17,18 @@ class SolutionDp {
* @param s the string of {@code 'a'} and {@code 'b'} characters
* @return the minimum number of deletions needed
*/
- @SuppressWarnings("unused")
int minimumDeletions(String s) {
- // TODO: Implement bottom-up DP solution
- throw new UnsupportedOperationException("Not yet implemented");
+ int n = s.length();
+ int[] dp = new int[n];
+ int bCount = s.charAt(0) == 'b' ? 1 : 0;
+ for (int i = 1; i < n; i++) {
+ if (s.charAt(i) == 'b') {
+ dp[i] = dp[i - 1];
+ bCount++;
+ } else {
+ dp[i] = Math.min(dp[i - 1] + 1, bCount);
+ }
+ }
+ return dp[n - 1];
}
}
diff --git a/src/main/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionMemoized.java b/src/main/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionMemoized.java
deleted file mode 100644
index 63f3a34..0000000
--- a/src/main/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionMemoized.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package codes.yam.leetcode.minimumdeletionstomakestringbalanced;
-
-/**
- * Memoized solution for the Minimum Deletions to Make String Balanced problem.
- *
- * Same recursive approach as {@code SolutionRecursive}, but caches overlapping subproblems. - * - *
O(n²)
- * O(n²)
- * At each character, choose to delete it or keep it, exploring all possibilities. - * - *
O(2^n)
- * O(n) (call stack)
- * Uses a split-point counting approach to compute minimum deletions in constant space. + * + *
O(n)
+ * O(1)
+ * Solution progression (split-point, optimized): + * + *
O(n) time, O(1)
+ * space
+ * Solution progression (DP approach): * *
O(2^n) time, O(n)
- * space
- * O(n²) time, O(n²)
- * space
* O(n) time, O(n) space
* O(n) time, O(1) space
* TODO: Current {@code Solution} uses a split-point approach. Once the DP progression is - * implemented, replace it with the cleaner DP formulation (rename current to {@code - * SolutionSplitPoint}). - * * @see Problem * Link */ diff --git a/src/test/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionRecursiveTest.java b/src/test/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionRecursiveTest.java deleted file mode 100644 index 68a662c..0000000 --- a/src/test/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionRecursiveTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package codes.yam.leetcode.minimumdeletionstomakestringbalanced; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -@Disabled("Not yet implemented") -class SolutionRecursiveTest { - @ParameterizedTest - @MethodSource("codes.yam.leetcode.minimumdeletionstomakestringbalanced.TestCases#cases") - void minimumDeletions(String s, int expected) { - assertEquals(expected, new SolutionRecursive().minimumDeletions(s)); - } -} diff --git a/src/test/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionMemoizedTest.java b/src/test/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionSplitPointTest.java similarity index 69% rename from src/test/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionMemoizedTest.java rename to src/test/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionSplitPointTest.java index 9cdff75..2e58b54 100644 --- a/src/test/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionMemoizedTest.java +++ b/src/test/java/codes/yam/leetcode/minimumdeletionstomakestringbalanced/SolutionSplitPointTest.java @@ -2,15 +2,13 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -@Disabled("Not yet implemented") -class SolutionMemoizedTest { +class SolutionSplitPointTest { @ParameterizedTest @MethodSource("codes.yam.leetcode.minimumdeletionstomakestringbalanced.TestCases#cases") void minimumDeletions(String s, int expected) { - assertEquals(expected, new SolutionMemoized().minimumDeletions(s)); + assertEquals(expected, new SolutionSplitPoint().minimumDeletions(s)); } }