题目链接
英文链接:https://leetcode.com/problems/swap-for-longest-repeated-character-substring/
中文链接:https://leetcode-cn.com/problems/swap-for-maximum-repeated-substring/
题目详述
如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。
示例 1:
1 | 输入:text = "ababa" |
示例 2:
1 | 输入:text = "aaabaaa" |
示例 3:
1 | 输入:text = "aaabbaaa" |
示例 4:
1 | 输入:text = "aaaaa" |
示例 5:
1 | 输入:text = "abcdef" |
提示:
- 1 <= text.length <= 20000
- text 仅由小写英文字母组成。
题目详解
滑动窗口,窗口内最多可以容忍一个不同的字符。类似于 LeetCode424-替换后的最长重复字符。
需要注意可能没有足够的字符进行交换,也就是最长不能超过该字符的个数。
1 | public class LeetCode_01156 { |
- 换一种思考方式,可以运用动态规划。
- 用
f(i)
表示没有交换过字符以位置i
结尾的个数,用g(i)
表示最多交换过一个字符以位置i
结尾的个数。 - 指定一种字符
- 当前字符等于指定字符时,
f(i) = f(i - 1) + 1
,g(i) = g(i - 1) + 1
。 - 当前字符不等于指定字符时,
g(i) = f(i - 1) + 1
,f(i) = 0
。 - 每次用
g(i)
更新结果。 - 可以运用状态压缩将两个数组压缩成两个变量。
- 当前字符等于指定字符时,
- 同样需要注意可能没有足够的字符进行交换,也就是最长不能超过该字符的个数。
1 | public class LeetCode_01156 { |