diff --git a/Algorithms/1208. Get Equal Substrings Within Budget/1208. Get Equal Substrings Within Budget.go b/Algorithms/1208. Get Equal Substrings Within Budget/1208. Get Equal Substrings Within Budget.go new file mode 100644 index 00000000..c4668453 --- /dev/null +++ b/Algorithms/1208. Get Equal Substrings Within Budget/1208. Get Equal Substrings Within Budget.go @@ -0,0 +1,16 @@ +package leetcode + +func equalSubstring(s string, t string, maxCost int) int { + left, right, res := 0, -1, 0 + for left < len(s) { + if right+1 < len(s) && maxCost-abs(int(s[right+1]-'a')-int(t[right+1]-'a')) >= 0 { + right++ + maxCost -= abs(int(s[right]-'a') - int(t[right]-'a')) + } else { + res = max(res, right-left+1) + maxCost += abs(int(s[left]-'a') - int(t[left]-'a')) + left++ + } + } + return res +} diff --git a/Algorithms/1208. Get Equal Substrings Within Budget/1208. Get Equal Substrings Within Budget_test.go b/Algorithms/1208. Get Equal Substrings Within Budget/1208. Get Equal Substrings Within Budget_test.go new file mode 100644 index 00000000..385f9e9b --- /dev/null +++ b/Algorithms/1208. Get Equal Substrings Within Budget/1208. Get Equal Substrings Within Budget_test.go @@ -0,0 +1,64 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question1208 struct { + para1208 + ans1208 +} + +// para 是参数 +// one 代表第一个参数 +type para1208 struct { + s string + t string + maxCost int +} + +// ans 是答案 +// one 代表第一个答案 +type ans1208 struct { + one int +} + +func Test_Problem1208(t *testing.T) { + + qs := []question1208{ + + question1208{ + para1208{"abcd", "bcdf", 3}, + ans1208{3}, + }, + + question1208{ + para1208{"abcd", "cdef", 3}, + ans1208{1}, + }, + + question1208{ + para1208{"abcd", "acde", 0}, + ans1208{1}, + }, + + question1208{ + para1208{"thjdoffka", "qhrnlntls", 11}, + ans1208{3}, + }, + + question1208{ + para1208{"krrgw", "zjxss", 19}, + ans1208{2}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 1208------------------------\n") + + for _, q := range qs { + _, p := q.ans1208, q.para1208 + fmt.Printf("【input】:%v 【output】:%v\n", p, equalSubstring(p.s, p.t, p.maxCost)) + } + fmt.Printf("\n\n\n") +} diff --git a/Algorithms/1208. Get Equal Substrings Within Budget/README.md b/Algorithms/1208. Get Equal Substrings Within Budget/README.md new file mode 100755 index 00000000..926824dc --- /dev/null +++ b/Algorithms/1208. Get Equal Substrings Within Budget/README.md @@ -0,0 +1,53 @@ +# [1208. Get Equal Substrings Within Budget](https://leetcode.com/problems/get-equal-substrings-within-budget/) + + +## 题目: + +You are given two strings `s` and `t` of the same length. You want to change `s` to `t`. Changing the `i`-th character of `s` to `i`-th character of `t` costs `|s[i] - t[i]|` that is, the absolute difference between the ASCII values of the characters. + +You are also given an integer `maxCost`. + +Return the maximum length of a substring of `s` that can be changed to be the same as the corresponding substring of `t`with a cost less than or equal to `maxCost`. + +If there is no substring from `s` that can be changed to its corresponding substring from `t`, return `0`. + +**Example 1:** + + Input: s = "abcd", t = "bcdf", maxCost = 3 + Output: 3 + Explanation: "abc" of s can change to "bcd". That costs 3, so the maximum length is 3. + +**Example 2:** + + Input: s = "abcd", t = "cdef", maxCost = 3 + Output: 1 + Explanation: Each character in s costs 2 to change to charactor in t, so the maximum length is 1. + +**Example 3:** + + Input: s = "abcd", t = "acde", maxCost = 0 + Output: 1 + Explanation: You can't make any change, so the maximum length is 1. + +**Constraints:** + +- `1 <= s.length, t.length <= 10^5` +- `0 <= maxCost <= 10^6` +- `s` and `t` only contain lower case English letters. + +## 题目大意 + +给你两个长度相同的字符串,s 和 t。将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。 + +用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。 + +提示: + +- 1 <= s.length, t.length <= 10^5 +- 0 <= maxCost <= 10^6 +- s 和 t 都只含小写英文字母。 + +## 解题思路 + +- 给出 2 个字符串 `s` 和 `t` 和一个“预算”,要求把“预算”尽可能的花完,`s` 中最多连续有几个字母能变成 `t` 中的字母。“预算”的定义是:|s[i] - t[i]| 。 +- 这一题是滑动窗口的题目,滑动窗口右边界每移动一格,就减少一定的预算,直到预算不能减少,再移动滑动窗口的左边界,这个时候注意要把预算还原回去。当整个窗口把字符 `s` 或 `t` 都滑动完了的时候,取出滑动过程中窗口的最大值即为结果。