Skip to content

Commit f09b7c4

Browse files
Merge pull request #148
add new problem 7.02
2 parents dc5e673 + 544ff63 commit f09b7c4

File tree

11 files changed

+244
-27
lines changed

11 files changed

+244
-27
lines changed

.idea/other.xml

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contest/build.gradle

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,12 @@ plugins {
66
java {
77
sourceCompatibility = JavaVersion.VERSION_17
88
targetCompatibility = JavaVersion.VERSION_17
9+
}
10+
11+
12+
dependencies {
13+
14+
implementation 'junit:junit:4.13.2'
15+
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
16+
917
}

contest/src/main/java/com/github/contest/CustomEXT.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,10 @@ fun MutableMap<Int, Int>.removeIfEmptyBucket(key: Int) {
88

99
fun Any.printData(label: String) {
1010
println("$label $this")
11+
}
12+
13+
14+
inline fun abs(number: Int): Int = when {
15+
number < 0 -> number * -1
16+
else -> number
1117
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.github.contest
22

33

4+
import com.github.contest.dp.divisorGameDp
5+
46

57
/**
68
* Stand
79
*/
810

911
fun main() {
1012

11-
13+
divisorGameDp(6)
1214

1315
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.github.contest.array
2+
3+
import org.junit.Test
4+
5+
6+
class CandyTest {
7+
8+
@Test
9+
fun `first_test_for_candy`() {}
10+
11+
12+
}

contest/src/main/java/com/github/contest/dp/DpLeetcode.kt

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.github.contest.dp
22

3+
import com.github.contest.abs
4+
5+
36
/**
47
* 1137. N-th Tribonacci Number
58
*/
@@ -127,4 +130,83 @@ fun longestPalindromeSubseq(s: String): Int {
127130
private fun String.hasSingle(): Boolean = when {
128131
this.length == 1 -> true
129132
else -> false
133+
}
134+
135+
/**
136+
* 647. Palindromic Substrings
137+
*/
138+
139+
140+
fun countSubstrings(s: String): Int {
141+
if (s.hasSingle()) return 1
142+
val n = s.length
143+
var counter = s.length
144+
val dp = Array(n) { BooleanArray(n) }
145+
for (i in 0 until n) dp[i][i] = true
146+
147+
for (len in 2..n) {
148+
for (i in 0..n - len) {
149+
val j = i + len - 1
150+
when {
151+
len == 2 -> {
152+
if (s[i] == s[j]) {
153+
counter++
154+
dp[i][j] = true
155+
}
156+
}
157+
158+
else -> {
159+
if (s[i] == s[j] && dp[i + 1][j - 1]) {
160+
counter++
161+
dp[i][j] = true
162+
}
163+
}
164+
}
165+
}
166+
}
167+
168+
return counter
169+
}
170+
171+
/**
172+
* 2370. Longest Ideal Subsequence
173+
*/
174+
175+
fun longestIdealString(s: String, k: Int): Int {
176+
val dp = IntArray(26) { 0 }
177+
178+
for (c in s) {
179+
val currIndex = c - 'a'
180+
var maxLength = 0
181+
for (prevIndex in 0..25) {
182+
if (abs(currIndex - prevIndex) <= k) {
183+
maxLength = maxOf(maxLength, dp[prevIndex])
184+
}
185+
}
186+
dp[currIndex] = maxOf(dp[currIndex], maxLength + 1)
187+
}
188+
189+
return dp.maxOrNull() ?: 0
190+
}
191+
192+
/**
193+
* 1025. Divisor Game
194+
* Dp Approach
195+
*/
196+
197+
fun divisorGameDp(n: Int): Boolean {
198+
if (n <= 1) return false
199+
val dp = BooleanArray(n + 1)
200+
dp[1] = false // Base case: If n is 1, the current player loses
201+
202+
for (i in 2..n) {
203+
for (x in 1 until i) {
204+
if (i % x == 0 && !dp[i - x]) {
205+
dp[i] = true
206+
break // If we find a winning move, we can stop checking
207+
}
208+
}
209+
}
210+
211+
return dp[n]
130212
}

contest/src/main/java/com/github/contest/dp/DpProdVariant.kt

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.github.contest.dp
22

3+
import com.github.contest.abs
4+
35

46
/**
57
* 70. Climbing Stairs
@@ -52,36 +54,34 @@ private fun String.hasSingle(): Boolean = when {
5254
}
5355

5456
/**
55-
* 647. Palindromic Substrings
57+
* 2370. Longest Ideal Subsequence
58+
* Prod Variant
5659
*/
5760

5861

59-
fun countSubstrings(s: String): Int {
60-
if (s.hasSingle()) return 1
61-
val n = s.length
62-
var counter = s.length
63-
val dp = Array(n) { BooleanArray(n) }
64-
for (i in 0 until n) dp[i][i] = true
62+
fun longestIdealStringProdVariant(s: String, k: Int): Int {
63+
val dp = IntArray(26) { 0 }
6564

66-
for (len in 2..n) {
67-
for (i in 0..n - len) {
68-
val j = i + len - 1
69-
when {
70-
len == 2 -> {
71-
if (s[i] == s[j]) {
72-
counter++
73-
dp[i][j] = true
74-
}
75-
}
76-
else -> {
77-
if (s[i] == s[j] && dp[i + 1][j - 1]) {
78-
counter++
79-
dp[i][j] = true
80-
}
81-
}
82-
}
65+
s.forEach {
66+
val index = it - 'a'
67+
var len = 0
68+
(0..25).forEach { prev ->
69+
if (abs(prev - index) <= k) len = maxOf(len, dp[prev])
8370
}
71+
dp[index] = maxOf(dp[index], len + 1)
8472
}
8573

86-
return counter
74+
return dp.max()
8775
}
76+
77+
78+
fun longestIdealStringProdVariantII(s: String, k: Int): Int =
79+
s.fold(IntArray(26)) { dp, c ->
80+
val currIndex = c - 'a'
81+
dp.apply {
82+
this[currIndex] = maxOf(this[currIndex], (0..25).maxOf { prevIndex ->
83+
if (abs(currIndex - prevIndex) <= k) this[prevIndex] else 0
84+
} + 1)
85+
}
86+
}.max()
87+

contest/src/main/java/com/github/contest/hashTable/HashTableLeetcode.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,35 @@ fun tupleSameProduct(nums: IntArray): Int {
116116
if (count > 1) tuples += count * (count - 1) * 4
117117
}
118118
return tuples
119+
}
120+
121+
/**
122+
* 1796. Second Largest Digit in a String
123+
*/
124+
125+
fun secondHighest(s: String): Int {
126+
if (s.hasSingle()) return -1
127+
val map = mutableMapOf<Int, Int>()
128+
for (char in s) {
129+
if (isDigit(char)) {
130+
val value = char.digitToInt()
131+
map[value] = map.getOrDefault(value, 0) + 1
132+
}
133+
}
134+
var keyMax = 0
135+
for (key in map.keys) {
136+
keyMax = maxOf(keyMax, key)
137+
}
138+
if (map.contains(keyMax)) map.remove(keyMax)
139+
140+
return map.keys.maxOrNull() ?: -1
141+
}
142+
143+
private fun String.hasSingle(): Boolean = when {
144+
this.length == 1 -> true
145+
else -> false
146+
}
147+
148+
private fun isDigit(s: Char): Boolean {
149+
return s in "0123456789"
119150
}

contest/src/main/java/com/github/contest/hashTable/HashTableProdVariant.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@ fun areAlmostEqualProdVariant(s1: String, s2: String): Boolean =
1515
.let { diff ->
1616
diff.size == 2 && s1[diff[0]] == s2[diff[1]] && s1[diff[1]] == s2[diff[0]]
1717
}
18-
}
18+
}
19+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.github.contest.hashTable.test
2+
3+
import com.github.contest.hashTable.areAlmostEqual
4+
import junit.framework.TestCase.assertEquals
5+
import org.junit.Test
6+
7+
8+
/**
9+
* 1790. Check if One String Swap Can Make Strings Equal
10+
* Test
11+
*/
12+
13+
class CheckIfOneStringSwapCanMakeStringsEqualTest {
14+
15+
16+
@Test
17+
fun `first_case`() {
18+
val s1 = "bank"
19+
val s2 = "kanb"
20+
21+
val expected = true
22+
val actual = areAlmostEqual(s1, s2)
23+
assertEquals(expected, actual)
24+
}
25+
26+
27+
@Test
28+
fun `one_element`() {
29+
val s1 = "a"
30+
val s2 = "b"
31+
32+
val actual = areAlmostEqual(s1, s2)
33+
assertEquals(false, actual)
34+
}
35+
36+
37+
@Test
38+
fun `two_equals_string`() {
39+
val s1 = "anna"
40+
val s2 = "anna"
41+
42+
val actual = areAlmostEqual(s1, s2)
43+
44+
assertEquals(true, actual)
45+
}
46+
47+
48+
}

0 commit comments

Comments
 (0)