找到最长的半重复子字符串

给你一个下标从 0 开始的字符串 s ,这个字符串只包含 0 到 9 的数字字符。
如果一个字符串 t 中至多有一对相邻字符是相等的,那么称这个字符串 t 是 半重复的 。例如,”0010” 、”002020” 、”0123” 、”2002” 和 “54944” 是半重复字符串,而 “00101022” (相邻的相同数字对是 00 和 22)和 “1101234883” (相邻的相同数字对是 11 和 88)不是半重复字符串。
请你返回 s 中最长半重复子字符串的长度。

  • 输入:s = “52233”
    输出:4
    解释:
    最长的半重复子字符串是 “5223”。整个字符串 “52233” 有两个相邻的相同数字对 22 和 33,但最多只能选取一个。

  • 输入:s = “5494”
    输出:4
    解释:

s 是一个半重复字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var longestSemiRepetitiveSubstring = function(s) {
const n = s.length
let i = 0
let answer = 1 /* 初始化为1而不是0,是考虑到当数组的长度为1时,无法进入循环 */
let countPair = 0
for (let j = 1; j < n; j++){
if (s[j] === s[j - 1]){
countPair += 1
while (countPair >= 2){
i++ /* 先i++,以保证指针总是在往右移动的 */
while (s[i] !== s[i - 1]){
i++
}
countPair -= 1
}
}
answer = Math.max(answer, j - i + 1)
}
return answer
};