程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

leetcode1156_go_单字符重复子串的最大长度

balukai 2025-04-26 16:44:50 文章精选 3 ℃

题目

如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。

给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。

示例 1:输入:text = "ababa" 输出:3

示例 2:输入:text = "aaabaaa" 输出:6

示例 3:输入:text = "aaabbaaa" 输出:4

示例 4:输入:text = "aaaaa" 输出:5

示例 5:输入:text = "abcdef" 输出:1

提示:1 <= text.length <= 20000

text 仅由小写英文字母组成。

解题思路分析

1、滑动窗口;时间复杂度O(n),空间复杂度O(1)

func maxRepOpt1(text string) int {
   res := 0
   n := len(text)
   arr := [26]int{}
   for i := 0; i < n; i++ {
      v := int(text[i] - 'a')
      arr[v]++ // 统计每个字母出现的次数
   }
   for i := 0; i < n; {
      v := int(text[i] - 'a')
      countA := 0 // 统计相同的个数
      for i+countA < n && text[i] == text[i+countA] {
         countA++
      }
      j := i + countA + 1
      countB := 0 // 统计相隔1个不同字符往后连续的次数
      for j+countB < n && text[i] == text[j+countB] {
         countB++
      }
      // 2种情况
      // 1、a...axa...ay..a 可以拿1个来补齐:+1
      // 2、没有多余的补齐,可以拿第二段右侧最后一个点或者第一段左侧第一个点来补:+0
      total := min(countA+countB+1, arr[v]) // 取较少的
      res = max(res, total)                 // 更新结果
      i = i + countA                        // 窗口后移

   }
   return res
}

func max(a, b int) int {
   if a > b {
      return a
   }
   return b
}

func min(a, b int) int {
   if a > b {
      return b
   }
   return a
}

总结

Medium题目,使用滑动窗口

Tags:

最近发表
标签列表