Leetcode 1156. 单字符重复子串的最大长度
题目
如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。
示例 1:
输入:text = "ababa"
输出:3
示例 2:
输入:text = "aaabaaa"
输出:6
示例 3:
输入:text = "aaabbaaa"
输出:4
示例 4:
输入:text = "aaaaa"
输出:5
示例 5:
输入:text = "abcdef"
输出:1
思路
- 对于每个left, 都一直往后面找, 设置一个计数变量统计不相等的数目, 当该变量小于2的时候更新结果
- 注意判断类似于aaab或者是acbaaa这样的情况, 代码中用2个if来判断这样的情况
代码 —— golang
func maxRepOpt1(text string) int {
// 定义2个整数取最大值
intMax := func(a int, b int) int{
if a <= b {
return b
} else {
return a
}
}
// 记录每个字符出现的次数
mp := map[string]int{}
for _, data := range "abcdefghijklmnopqrstuvwxyz" {
str := string(data)
mp[str] = strings.Count(text, str)
}
res, size := 0, len(text)
for left := 0;left < size;left++ {
cntNotequal := 0 // 用于记录不相等的个数
for right := left;right < size;right++ {
if text[right] != text[left] {
cntNotequal++
}
if cntNotequal < 2 {
// 判断是否还有其他的可以交换的字母
length := right - left + 1
if cntNotequal == 1 && length - cntNotequal == mp[string(text[left])] {
length -= 1
}
if right == size - 1 && length < mp[string(text[left])] && cntNotequal == 0 {
length += 1
}
res = intMax(res, length)
}
}
}
return res
}