From f06c2431f69ad2cc8f596d9e5cab79d05d3008ae Mon Sep 17 00:00:00 2001 From: YDZ Date: Sat, 8 Jun 2019 14:24:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20problem=20424?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Longest Repeating Character Replacement.go | 15 +++++ ...st Repeating Character Replacement_test.go | 63 +++++++++++++++++++ .../README.md | 49 +++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 Algorithms/424. Longest Repeating Character Replacement/424. Longest Repeating Character Replacement.go create mode 100644 Algorithms/424. Longest Repeating Character Replacement/424. Longest Repeating Character Replacement_test.go create mode 100644 Algorithms/424. Longest Repeating Character Replacement/README.md diff --git a/Algorithms/424. Longest Repeating Character Replacement/424. Longest Repeating Character Replacement.go b/Algorithms/424. Longest Repeating Character Replacement/424. Longest Repeating Character Replacement.go new file mode 100644 index 00000000..874b0028 --- /dev/null +++ b/Algorithms/424. Longest Repeating Character Replacement/424. Longest Repeating Character Replacement.go @@ -0,0 +1,15 @@ +package leetcode + +func characterReplacement(s string, k int) int { + res, left, right, counter, freq := 0, 0, 1, 0, make([]int, 26) + for right = 0; right < len(s); right++ { + freq[s[right]-'A']++ + counter = max(counter, freq[s[right]-'A']) + for right-left+1-counter > k { + freq[s[left]-'A']-- + left++ + } + res = max(res, right-left+1) + } + return res +} diff --git a/Algorithms/424. Longest Repeating Character Replacement/424. Longest Repeating Character Replacement_test.go b/Algorithms/424. Longest Repeating Character Replacement/424. Longest Repeating Character Replacement_test.go new file mode 100644 index 00000000..2c3d5bd3 --- /dev/null +++ b/Algorithms/424. Longest Repeating Character Replacement/424. Longest Repeating Character Replacement_test.go @@ -0,0 +1,63 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question424 struct { + para424 + ans424 +} + +// para 是参数 +// one 代表第一个参数 +type para424 struct { + s string + k int +} + +// ans 是答案 +// one 代表第一个答案 +type ans424 struct { + one int +} + +func Test_Problem424(t *testing.T) { + + qs := []question424{ + + question424{ + para424{"AABABBA", 1}, + ans424{4}, + }, + + question424{ + para424{"ABBB", 2}, + ans424{4}, + }, + + question424{ + para424{"BAAA", 0}, + ans424{3}, + }, + + question424{ + para424{"ABCDE", 1}, + ans424{2}, + }, + + question424{ + para424{"BAAAB", 2}, + ans424{5}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 424------------------------\n") + + for _, q := range qs { + _, p := q.ans424, q.para424 + fmt.Printf("【input】:%v 【output】:%v\n", p, characterReplacement(p.s, p.k)) + } + fmt.Printf("\n\n\n") +} diff --git a/Algorithms/424. Longest Repeating Character Replacement/README.md b/Algorithms/424. Longest Repeating Character Replacement/README.md new file mode 100644 index 00000000..8b962472 --- /dev/null +++ b/Algorithms/424. Longest Repeating Character Replacement/README.md @@ -0,0 +1,49 @@ +# [424. Longest Repeating Character Replacement](https://leetcode.com/problems/longest-repeating-character-replacement/) + +## 题目 + + +Given a string that consists of only uppercase English letters, you can replace any letter in the string with another letter at most k times. Find the length of a longest substring containing all repeating letters you can get after performing the above operations. + +Note: + +Both the string's length and k will not exceed 10^4. + +Example 1: + +```c +Input: +s = "ABAB", k = 2 + +Output: +4 + +Explanation: +Replace the two 'A's with two 'B's or vice versa. +``` + +Example 2: + +```c +Input: +s = "AABABBA", k = 1 + +Output: +4 + +Explanation: +Replace the one 'A' in the middle with 'B' and form "AABBBBA". +The substring "BBBB" has the longest repeating letters, which is 4. +``` + + + +## 题目大意 + + +给一个字符串和变换次数 K,要求经过 K 次字符转换以后,输出相同字母能出现连续最长的长度。 + + +这道题笔者也提交了好几遍才通过。这一题是考察滑动窗口的题目,但是不能单纯的把左右窗口往右移动。因为有可能存在 ABBBBBA 的情况,这种情况需要从两边方向同时判断。正确的滑动窗口的做法应该是,边滑动的过程中边统计出现频次最多的字母,因为最后求得的最长长度的解,一定是在出现频次最多的字母上,再改变其他字母得到的最长连续长度。窗口滑动的过程中,用窗口的长度减去窗口中出现频次最大的长度,如果差值比 K 大,就代表需要缩小左窗口了直到差值等于 K。res 不断的取出窗口的长度的最大值就可以了。 + +