「每日LeetCode」2021年7月11日

本文最后更新于:2023年3月19日 晚上

Lt5817. 判断字符串是否可分解为值均等的子串

5817. 判断字符串是否可分解为值均等的子串

一个字符串的所有字符都是一样的,被称作等值字符串。

  • 举例,"1111""33" 就是等值字符串。
  • 相比之下,"123"就不是等值字符串。

规则:给出一个数字字符串 s,将字符串分解成一些等值字符串,如果有且仅有一个等值子字符串长度为 2,其他的等值子字符串的长度都是 3.
如果能够按照上面的规则分解字符串 s,就返回真,否则返回假。
子串就是原字符串中连续的字符序列。
示例 1:

1
2
3
输入: s = "000111000"
输出: false
解释: s只能被分解长度为3的等值子字符串。

示例 2:

1
2
3
输入: s = "00011111222"
输出: true
解释: s 能被分解为 ["000","111","11","222"].

示例 3:

1
2
3
输入: s = "01110002223300"
输出: false
解释: 一个不能被分解的原因是在开头有一个0.

提示:

  • 1 <= s.length <``= 1000
  • s 仅包含数字。

思路

遍历字符串记录并判断连续的字符串,如果连续个数小于 2 或者除以 3 取余数为 1 的话说明为 n 个 3 和两个 2 的组合,返回 false。如果刚好为 2 说明为 n 个 3 及一个 2 的组合,用 flag 判断是否在字符串中已经出现过 2 了,出现过的话返回 false。最后返回 flag 即可。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* @param {string} s
* @return {boolean}
*/
var isDecomposable = function (s) {
let prev = null,
count = 0,
flag = false;
for (const char of s + " ") {
if (!prev) {
prev = char;
} else {
count++;
if (char !== prev) {
if (count < 2 || count % 3 === 1) return false;
else if (count % 3 === 2) {
if (flag) return false;
flag = true;
}
prev = char;
count = 0;
}
}
}
return flag;
};