Leetcode 1156. 单字符重复子串的最大长度

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值