Skip to content

Commit 087797f

Browse files
committed
- DeleteOperationForTwoStrings
- MinimumASCIIDeleteSumForTwoStrings Signed-off-by: Gopal S Akshintala <[email protected]>
1 parent 819a5a8 commit 087797f

File tree

11 files changed

+215
-149
lines changed

11 files changed

+215
-149
lines changed

ds-algo/src/main/java/practice/HIndex.java

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,30 @@
44

55
/** [274. H-Index](https://leetcode.com/problems/h-index) */
66
public class HIndex {
7-
public int hIndex(int[] citations) {
8-
var buckets = new int[citations.length + 1];
9-
for (var citation : citations) {
10-
// ! Any with more than citations length fall into nth extra bucket
11-
if (citation > citations.length) { // ! or `buckets.length - 1`
12-
buckets[buckets.length - 1]++;
13-
} else {
14-
buckets[citation]++;
15-
}
16-
}
17-
var paperCount = 0;
18-
for (var i = buckets.length - 1; i >= 0; i--) { // ! Iterating backwards
19-
paperCount += buckets[i];
20-
// ! All citations above `i` are cited more than `i` times
21-
if (paperCount >= i) {
22-
return i;
23-
}
24-
}
25-
return 0;
26-
}
7+
public int hIndex(int[] citations) {
8+
var buckets = new int[citations.length + 1];
9+
for (var citation : citations) {
10+
// ! Any with more than citations length fall into nth extra bucket
11+
if (citation > citations.length) { // ! or `buckets.length - 1`
12+
buckets[buckets.length - 1]++;
13+
} else {
14+
buckets[citation]++;
15+
}
16+
}
17+
var paperCount = 0;
18+
for (var i = buckets.length - 1; i >= 0; i--) { // ! Iterating backwards
19+
paperCount += buckets[i];
20+
// ! All citations above `i` are cited more than `i` times
21+
if (paperCount >= i) {
22+
return i;
23+
}
24+
}
25+
return 0;
26+
}
2727

28-
static void main() {
29-
var l = new HIndex();
30-
System.out.println(l.hIndex(new int[] {3, 0, 6, 1, 5})); // 3
31-
System.out.println(l.hIndex(new int[] {1, 3, 1})); // 1
32-
}
28+
static void main() {
29+
var l = new HIndex();
30+
System.out.println(l.hIndex(new int[] {3, 0, 6, 1, 5})); // 3
31+
System.out.println(l.hIndex(new int[] {1, 3, 1})); // 1
32+
}
3333
}

ds-algo/src/main/java/practice/LemonadeChange.java

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,33 @@
44

55
/** [860. Lemonade Change](https://leetcode.com/problems/lemonade-change/) */
66
public class LemonadeChange {
7-
public boolean lemonadeChange(int[] bills) {
8-
var five = 0;
9-
var ten = 0;
10-
for (var bill : bills) {
11-
if (bill == 5) {
12-
five++;
13-
} else if (bill == 10) {
14-
five--;
15-
ten++;
16-
} else {
17-
if (ten > 0) {
18-
ten--;
19-
five--;
20-
} else {
21-
five -= 3;
22-
}
23-
}
24-
if (five < 0) {
25-
return false;
26-
}
27-
}
28-
return true;
29-
}
7+
public boolean lemonadeChange(int[] bills) {
8+
var five = 0;
9+
var ten = 0;
10+
for (var bill : bills) {
11+
if (bill == 5) {
12+
five++;
13+
} else if (bill == 10) {
14+
five--;
15+
ten++;
16+
} else {
17+
if (ten > 0) {
18+
ten--;
19+
five--;
20+
} else {
21+
five -= 3;
22+
}
23+
}
24+
if (five < 0) {
25+
return false;
26+
}
27+
}
28+
return true;
29+
}
3030

31-
static void main() {
32-
var l = new LemonadeChange();
33-
System.out.println(l.lemonadeChange(new int[] {5, 5, 5, 10, 20})); // true
34-
System.out.println(l.lemonadeChange(new int[] {5, 5, 10, 10, 20})); // false
35-
}
31+
static void main() {
32+
var l = new LemonadeChange();
33+
System.out.println(l.lemonadeChange(new int[] {5, 5, 5, 10, 20})); // true
34+
System.out.println(l.lemonadeChange(new int[] {5, 5, 10, 10, 20})); // false
35+
}
3636
}

ds-algo/src/main/java/practice/ThreeSum.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ public List<List<Integer>> threeSum(int[] nums) {
1111
var result = new ArrayList<List<Integer>>();
1212
for (var left1 = 0; left1 < nums.length; left1++) {
1313
if (left1 == 0 || nums[left1] != nums[left1 - 1]) {
14-
// ! init left2, right in the inner loop
14+
// ! init left2, right in the inner loop
1515
var left2 = left1 + 1;
16-
var right = nums.length - 1;
16+
var right = nums.length - 1;
1717
while (left2 < right) {
1818
var sum = nums[left1] + nums[left2] + nums[right];
1919
if (sum > 0) {
@@ -22,9 +22,9 @@ public List<List<Integer>> threeSum(int[] nums) {
2222
left2++;
2323
} else {
2424
result.add(Arrays.asList(nums[left1], nums[left2], nums[right]));
25-
do {
26-
left2++;
27-
} while (nums[left2] == nums[left2 - 1] && left2 < right);
25+
do {
26+
left2++;
27+
} while (nums[left2] == nums[left2 - 1] && left2 < right);
2828
}
2929
}
3030
}

ds-algo/src/main/java/practice/ValidTriangleNumber.java

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,35 @@
22

33
/* 26 Oct 2025 12:14 */
44

5-
import java.util.Arrays;
6-
75
import static java.lang.IO.println;
86

9-
/**
10-
* [611. Valid Triangle Number](https://leetcode.com/problems/valid-triangle-number/)
11-
*/
7+
import java.util.Arrays;
8+
9+
/** [611. Valid Triangle Number](https://leetcode.com/problems/valid-triangle-number/) */
1210
public class ValidTriangleNumber {
13-
public int triangleNumber(int[] nums) {
14-
Arrays.sort(nums);
15-
var count = 0;
16-
// ! Fix the largest side (right) and find pairs of smaller sides
17-
for (var right = nums.length - 1; right >= 2; right--) {
18-
var left1 = 0;
19-
var left2 = right - 1;
20-
while (left1 < left2) {
21-
if (nums[left1] + nums[left2] > nums[right]) {
22-
// ! All elements between left1 and left2 form valid triangles with left2 and right
23-
count += left2 - left1;
24-
left2--;
25-
} else {
26-
left1++;
27-
}
28-
}
29-
}
30-
return count;
31-
}
11+
public int triangleNumber(int[] nums) {
12+
Arrays.sort(nums);
13+
var count = 0;
14+
// ! Fix the largest side (right) and find pairs of smaller sides
15+
for (var right = nums.length - 1; right >= 2; right--) {
16+
var left1 = 0;
17+
var left2 = right - 1;
18+
while (left1 < left2) {
19+
if (nums[left1] + nums[left2] > nums[right]) {
20+
// ! All elements between left1 and left2 form valid triangles with left2 and right
21+
count += left2 - left1;
22+
left2--;
23+
} else {
24+
left1++;
25+
}
26+
}
27+
}
28+
return count;
29+
}
3230

33-
static void main() {
34-
var obj = new ValidTriangleNumber();
35-
println(obj.triangleNumber(new int[] {2, 2, 3, 4})); // 3
36-
println(obj.triangleNumber(new int[] {4, 2, 3, 4})); // 4
37-
}
31+
static void main() {
32+
var obj = new ValidTriangleNumber();
33+
println(obj.triangleNumber(new int[] {2, 2, 3, 4})); // 3
34+
println(obj.triangleNumber(new int[] {4, 2, 3, 4})); // 4
35+
}
3836
}

ds-algo/src/main/java/practice/dp/CombinationSum4.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public int combinationSum4(int[] nums, int target) {
99
dp[0] = 1;
1010
for (var sum = 1; sum <= target; sum++) {
1111
for (var num : nums) {
12-
// ! Borrow from all previous sums, to add up to combinations
12+
// ! Borrow from all previous sums, to add up to combinations
1313
if (num <= sum) {
1414
dp[sum] += dp[sum - num];
1515
}

ds-algo/src/main/java/practice/dp/DeleteAndEarn.java

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,25 @@
44

55
import static java.lang.IO.println;
66

7-
/**
8-
* [740. Delete and Earn](https://leetcode.com/problems/delete-and-earn/)
9-
*/
7+
/** [740. Delete and Earn](https://leetcode.com/problems/delete-and-earn/) */
108
public class DeleteAndEarn {
11-
public int deleteAndEarn(int[] nums) {
12-
var buckets = new int[1 + (int) Math.pow(10, 4)];
13-
for (var num : nums) {
14-
buckets[num] += num;
15-
}
16-
var dp = new int[buckets.length];
17-
dp[0] = 0; // ! or buckets[0], which is 0
18-
dp[1] = buckets[1]; // ! No need of `maxOf` as it's either 0 or positive
19-
for (var i = 2; i < dp.length; i++) {
20-
dp[i] = Math.max(dp[i - 1], buckets[i] + dp[i - 2]);
21-
}
22-
return dp[dp.length - 1];
23-
}
9+
public int deleteAndEarn(int[] nums) {
10+
var buckets = new int[1 + (int) Math.pow(10, 4)];
11+
for (var num : nums) {
12+
buckets[num] += num;
13+
}
14+
var dp = new int[buckets.length];
15+
dp[0] = 0; // ! or buckets[0], which is 0
16+
dp[1] = buckets[1]; // ! No need of `maxOf` as it's either 0 or positive
17+
for (var i = 2; i < dp.length; i++) {
18+
dp[i] = Math.max(dp[i - 1], buckets[i] + dp[i - 2]);
19+
}
20+
return dp[dp.length - 1];
21+
}
2422

25-
static void main() {
26-
var obj = new DeleteAndEarn();
27-
println(obj.deleteAndEarn(new int[] {3, 4, 2})); // 6
28-
println(obj.deleteAndEarn(new int[] {2, 2, 3, 3, 3, 4})); // 9
29-
}
23+
static void main() {
24+
var obj = new DeleteAndEarn();
25+
println(obj.deleteAndEarn(new int[] {3, 4, 2})); // 6
26+
println(obj.deleteAndEarn(new int[] {2, 2, 3, 3, 3, 4})); // 9
27+
}
3028
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package practice.dp;
2+
3+
/* 26 Oct 2025 16:29 */
4+
5+
public class DeleteOperationForTwoStrings {
6+
public int minDistance(String word1, String word2) {
7+
var commonSubsequenceLen = longestCommonSubsequence(word1, word2);
8+
// ! Delete all the letters except the common ones
9+
return word1.length() + word2.length() - 2 * commonSubsequenceLen;
10+
}
11+
12+
private static int longestCommonSubsequence(String word1, String word2) {
13+
var table = new int[word1.length() + 1][word2.length() + 1];
14+
for (var i = 0; i <= word1.length(); i++) {
15+
for (var j = 0; j <= word2.length(); j++) {
16+
if (i == 0 || j == 0) {
17+
table[i][j] = 0;
18+
} else if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
19+
table[i][j] = 1 + table[i - 1][j - 1];
20+
} else {
21+
table[i][j] = Math.max(table[i - 1][j], table[i][j - 1]);
22+
}
23+
}
24+
}
25+
return table[word1.length()][word2.length()];
26+
}
27+
28+
static void main() {
29+
var obj = new DeleteOperationForTwoStrings();
30+
System.out.println(obj.minDistance("sea", "eat")); // 2
31+
System.out.println(obj.minDistance("leetcode", "etco")); // 4
32+
}
33+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package practice.dp;
2+
3+
/* Created by gakshintala on 6/11/16. */
4+
5+
/** [1143. Longest Common Subsequence](https://leetcode.com/problems/longest-common-subsequence/) */
6+
public class LongestCommonSubsequence {
7+
public int longestCommonSubsequence(String text1, String text2) {
8+
var table = new int[text1.length() + 1][text2.length() + 1];
9+
for (var i = 0; i <= text1.length(); i++) {
10+
for (var j = 0; j <= text2.length(); j++) {
11+
if (i == 0 || j == 0) { // One of the strings is empty, so nothing in common
12+
table[i][j] = 0;
13+
} else {
14+
// if char matches
15+
if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
16+
table[i][j] = 1 + table[i - 1][j - 1];
17+
} else { // Unlike substring, the match streak is not broken; we continue to build up
18+
// max of length if char not present in `a`, char not present in `b`
19+
// No `+1` as no match
20+
table[i][j] = Math.max(table[i - 1][j], table[i][j - 1]);
21+
}
22+
}
23+
}
24+
}
25+
return table[text1.length()][text2.length()];
26+
}
27+
28+
static void main() {
29+
var obj = new LongestCommonSubsequence();
30+
System.out.println(obj.longestCommonSubsequence("abcde", "ace")); // 3
31+
System.out.println(obj.longestCommonSubsequence("abc", "abc")); // 3
32+
System.out.println(obj.longestCommonSubsequence("abc", "def")); // 0
33+
}
34+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package practice.dp;
2+
3+
/* 26 Oct 2025 17:19 */
4+
5+
/**
6+
* [712. Minimum ASCII Delete Sum for Two
7+
* Strings](https://leetcode.com/problems/minimum-ascii-delete-sum-for-two-strings/)
8+
*/
9+
public class MinimumASCIIDeleteSumForTwoStrings {
10+
public int minimumDeleteSum(String s1, String s2) {
11+
var commonSubsequenceCost = commonSubsequenceCost(s1, s2);
12+
var s1Cost = s1.chars().sum();
13+
var s2Cost = s2.chars().sum();
14+
return s1Cost + s2Cost - 2 * commonSubsequenceCost;
15+
}
16+
17+
private static int commonSubsequenceCost(String s1, String s2) {
18+
var dp = new int[s1.length() + 1][s2.length() + 1];
19+
for (var i = 0; i <= s1.length(); i++) {
20+
for (var j = 0; j <= s2.length(); j++) {
21+
if (i == 0 || j == 0) {
22+
dp[i][j] = 0;
23+
} else if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
24+
dp[i][j] = s1.charAt(i - 1) + dp[i - 1][j - 1];
25+
} else {
26+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
27+
}
28+
}
29+
}
30+
return dp[s1.length()][s2.length()];
31+
}
32+
33+
static void main() {
34+
var obj = new MinimumASCIIDeleteSumForTwoStrings();
35+
System.out.println(obj.minimumDeleteSum("sea", "eat")); // 231
36+
System.out.println(obj.minimumDeleteSum("delete", "leet")); // 403
37+
}
38+
}

ds-algo/src/main/kotlin/leetcode/dp/HouseRobber.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ fun robBottomUp(nums: IntArray): Int {
99
dp[0] = nums[0]
1010
dp[1] = maxOf(nums[0], nums[1])
1111
for (i in 2..nums.lastIndex) {
12-
dp[i] = maxOf(dp[i-1], nums[i] + dp[i - 2])
12+
dp[i] = maxOf(dp[i - 1], nums[i] + dp[i - 2])
1313
}
14-
return dp.last();
14+
return dp.last()
1515
}
1616

1717
fun robTopDown(nums: IntArray, idx: Int = 0, memo: IntArray = IntArray(nums.size) { -1 }): Int =
@@ -38,8 +38,8 @@ fun rob(nums: IntArray): Int {
3838

3939
fun main() {
4040
println(robBottomUp(intArrayOf(1, 2, 3, 1))) // 4
41-
println(robBottomUp(intArrayOf(2,7,9,3,1))) // 12
42-
41+
println(robBottomUp(intArrayOf(2, 7, 9, 3, 1))) // 12
42+
4343
println(robTopDown(intArrayOf(1, 2, 3, 1))) // 4
44-
println(robTopDown(intArrayOf(2,7,9,3,1))) // 12
44+
println(robTopDown(intArrayOf(2, 7, 9, 3, 1))) // 12
4545
}

0 commit comments

Comments
 (0)