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

108 阅读1分钟

🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->单字符重复子串的最大长度

问题描述

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

给你一个字符串 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 仅由小写英文字母组成。

思路分析

首先我们需要先理解一下题目的意思,题目会给我们一个字符串 text,我们只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串,我们需要计算所能得到的子串的最大长度。我们可以结合一下几个示例来理解题目:

  • 1、text = "ababa"

我们可以交换第二个字符'b'和最后一个字符,得到'aaabb',这时我们可以得到最长的单字符重复的子串'aaa',其长度为3,所以我们可以得到的答案为3。

  • 2、text = "aaabaaa"

这种情况我们可以交换第一个字符'a'和第四个字符'b'或交换第四个字符'b'和第七个字符'a',得到'baaaaaa'或'aaaaaab',这时我们可以得到的最长单字符重复子串为'aaaaaa',其长度为6,所以我们可以得到的答案为6。

  • 3、text = "aaabbaaaa"

这种情况我们可以用前三个'a'中的任意一个交换第五个字符'b',得到新的字符串'aabbaaaaa',这时我们可以得到的最长单字符重复子串为'aaaaa',其长度为5,所以我们可以得到的答案为5。

  • 4、text = 'aaaa'

这种情况原字符串'aaaa'即为符合条件的单字符重复字符串,我们可以直接返回该字符串的长度即可。

  • 5、text = 'aabaaba'

这种情况下我们可以交换第三个字符'b'和最后一个'a',得到新的字符串'aaaaabb',这时我们可以得到的最长单字符重复子串为'aaaaa',其长度为5,所以我们可以得到的答案为5。

  • 6、text = 'aaaaab'

这种情况下我们不需要交换字符,其最长单字符重复子串为'aaaaa';

简单分析之后,我们可以得到交换的情况主要有上面列举的这6种,所以我们只需要分情况来计算即可。

AC代码

完整AC代码如下:

/**
 * @param {string} text
 * @return {number}
 */
var maxRepOpt1 = function (text) {
  let cMap = {},
    res = 1,
    letter = [],
    cnt = [];
  for (let i = 0; i < text.length; i++) {
    cMap[text[i]] = (cMap[text[i]] || 0) + 1;
    if (text[i] != text[i - 1]) {
      letter.push(text[i]);
      cnt.push(0);
    }
    cnt[cnt.length - 1]++;
  }
  if (letter.length == 1) return text.length;
  for (let i = 0; i < letter.length; i++) {
    res = Math.max(res, cnt[i] + (cMap[letter[i]] > cnt[i] ? 1 : 0));
    if (letter[i] != letter[i - 1] && letter[i] == letter[i - 2]) {
      let sum = cnt[i];
      if (cnt[i - 1] == 1) {
        sum += cnt[i - 2];
      }
      if (cMap[letter[i]] > sum) sum++;
      res = Math.max(res, sum);
    }
  }
  return res;
};

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。