From d4deeba2f04acefffc8b5f80cafeaeda5b61a19e Mon Sep 17 00:00:00 2001 From: Ashwagandha-coder Date: Wed, 9 Apr 2025 10:19:26 +0100 Subject: [PATCH 1/2] add 76 problem --- .../main/java/com/github/contest/Execute.kt | 6 ++- .../slidingWindow/SlidingWindowLeetcode.kt | 54 +++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/contest/src/main/java/com/github/contest/Execute.kt b/contest/src/main/java/com/github/contest/Execute.kt index 37e1ba87..8a841fa5 100644 --- a/contest/src/main/java/com/github/contest/Execute.kt +++ b/contest/src/main/java/com/github/contest/Execute.kt @@ -1,7 +1,7 @@ package com.github.contest -import com.github.contest.hashTable.minimumOperations +import com.github.contest.slidingWindow.minWindow import java.util.TreeMap @@ -11,7 +11,9 @@ import java.util.TreeMap fun main() { - minimumOperations(intArrayOf(1, 2, 3, 4, 2, 3, 3, 5, 7)).also { println(it) } + val s = "a" + val t = "a" + minWindow(s, t).also { println(it) } } fun testing() { diff --git a/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowLeetcode.kt b/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowLeetcode.kt index 56d96739..915681b5 100644 --- a/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowLeetcode.kt +++ b/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowLeetcode.kt @@ -1,2 +1,56 @@ package com.github.contest.slidingWindow +/** + * 76. Minimum Window Substring + */ + +fun minWindow(s: String, t: String): String { + if (t.length > s.length) return "" + val store = mutableMapOf() + + store.fillMapFromString(t) + + for (k in t.length..s.length) { + val cache = mutableMapOf() + var left = 0 + for (right in s.indices) { + val key = s[right] + cache[key] = cache.getOrDefault(key, 0) + 1 + if ((right - left) == (k - 1)) { + val isUnique = checkUniqueAnswer(store, cache) + if (isUnique) return s.substring(left, right + 1) + cache.reduceOrRemove(s[left]) + left++ + } + } + } + + return "" +} + +private fun MutableMap.fillMapFromString(str: String) { + for (char in str) this[char] = this.getOrDefault(char, 0) + 1 +} + +private fun MutableMap.reduceOrRemove(key: Char) { + this[key] = this.getOrDefault(key, 0) - 1 + if (this[key] == 0) this.remove(key) +} + +private fun checkUniqueAnswer(store: MutableMap, cache: MutableMap): Boolean { + var isUnique = true + for ((char, count) in store) { + if (cache.contains(char)) { + val cacheCount = cache.getOrDefault(char, 0) + if (cacheCount < count) { + isUnique = false + break + } + } else { + isUnique = false + break + } + } + + return isUnique +} \ No newline at end of file From 7a8209cbb3aeea82f774e40042bfa9bc77c4e164 Mon Sep 17 00:00:00 2001 From: Ashwagandha-coder Date: Wed, 9 Apr 2025 15:05:38 +0100 Subject: [PATCH 2/2] add base structure for sliding window problems --- .idea/misc.xml | 2 +- .../main/java/com/github/contest/Execute.kt | 8 +-- .../SlidingWindowAlternativeSolution.kt | 50 +++++++++++++++++++ .../slidingWindow/SlidingWindowProdVariant.kt | 5 ++ 4 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowAlternativeSolution.kt create mode 100644 contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowProdVariant.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index 9f71c83d..0ad17cbd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - + diff --git a/contest/src/main/java/com/github/contest/Execute.kt b/contest/src/main/java/com/github/contest/Execute.kt index 8a841fa5..3264572d 100644 --- a/contest/src/main/java/com/github/contest/Execute.kt +++ b/contest/src/main/java/com/github/contest/Execute.kt @@ -1,7 +1,7 @@ package com.github.contest -import com.github.contest.slidingWindow.minWindow +import com.github.contest.slidingWindow.minWindowOptimumSolution import java.util.TreeMap @@ -11,9 +11,9 @@ import java.util.TreeMap fun main() { - val s = "a" - val t = "a" - minWindow(s, t).also { println(it) } + val s = "ADOBECODEBANC" + val t = "ABC" + minWindowOptimumSolution(s, t).also { println(it) } } fun testing() { diff --git a/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowAlternativeSolution.kt b/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowAlternativeSolution.kt new file mode 100644 index 00000000..1baec341 --- /dev/null +++ b/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowAlternativeSolution.kt @@ -0,0 +1,50 @@ +package com.github.contest.slidingWindow + + +/** + * + */ + +fun minWindowOptimumSolution(s: String, t: String): String { + if (s.isEmpty() || t.isEmpty()) return "" + + val targetMap = mutableMapOf() + for (char in t) { + targetMap[char] = targetMap.getOrDefault(char, 0) + 1 + } + + var left = 0 + var right = 0 + var minLength = Int.MAX_VALUE + var minStart = 0 + val required = targetMap.size + var formed = 0 + val windowCounts = mutableMapOf() + + while (right < s.length) { + val char = s[right] + windowCounts[char] = windowCounts.getOrDefault(char, 0) + 1 + + if (targetMap.containsKey(char) && windowCounts[char] == targetMap[char]) { + formed++ + } + + while (left <= right && formed == required) { + if (right - left + 1 < minLength) { + minLength = right - left + 1 + minStart = left + } + + val leftChar = s[left] + windowCounts[leftChar] = windowCounts.getOrDefault(leftChar, 0) - 1 + if (targetMap.containsKey(leftChar) && windowCounts[leftChar]!! < targetMap[leftChar]!!) { + formed-- + } + left++ + } + + right++ + } + + return if (minLength == Int.MAX_VALUE) "" else s.substring(minStart, minStart + minLength) +} \ No newline at end of file diff --git a/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowProdVariant.kt b/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowProdVariant.kt new file mode 100644 index 00000000..0cac09ab --- /dev/null +++ b/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowProdVariant.kt @@ -0,0 +1,5 @@ +package com.github.contest.slidingWindow + +/** + * + */ \ No newline at end of file