🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->单字符重复子串的最大长度
问题描述
如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。
示例 1:
输入: text = "ababa"
输出: 3
示例 2:
输入: text = "aaabaaa"
输出: 6
示例 3:
输入: text = "aaabbaaa"
输出: 4
示例 4:
输入: text = "aaaaa"
输出: 5
示例 5:
输入: text = "abcdef"
输出: 1
提示:
1 <= text.length <= 20000text仅由小写英文字母组成。
思路分析
首先我们需要先理解一下题目的意思,题目会给我们一个字符串 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。