3707. 相等子字符串分数
题目描述
给你一个由小写英文字母组成的字符串 s
。
一个字符串的 得分 是其字符在字母表中的位置之和,其中 'a' = 1
,'b' = 2
,...,'z' = 26
。
请你判断是否存在一个下标 i
,使得该字符串可以被拆分成两个 非空子字符串 s[0..i]
和 s[(i + 1)..(n - 1)]
,且它们的得分 相等 。
如果存在这样的拆分,则返回 true
,否则返回 false
。
一个 子字符串 是字符串中 非空 的连续字符序列。
示例 1:
输入: s = "adcb"
输出: true
解释:
在下标 i = 1
处拆分:
- 左子字符串 =
s[0..1] = "ad"
,得分 =1 + 4 = 5
- 右子字符串 =
s[2..3] = "cb"
,得分 =3 + 2 = 5
两个子字符串的得分相等,因此输出为 true
。
示例 2:
输入: s = "bace"
输出: false
解释:
没有拆分能产生相等的得分,因此输出为 false
。
提示:
2 <= s.length <= 100
s
由小写英文字母组成。
解法
方法一:前缀和
我们先计算字符串的总得分,记为 \(r\)。然后我们从左到右遍历前 \(n-1\) 个字符,计算前缀得分 \(l\),并更新后缀得分 \(r\)。如果在某个位置 \(i\),前缀得分 \(l\) 等于后缀得分 \(r\),则说明存在一个下标 \(i\) 可以将字符串拆分成两个得分相等的子字符串,返回 \(\textit{true}\)。如果遍历结束后仍未找到这样的下标,返回 \(\textit{false}\)。
时间复杂度 \(O(n)\),其中 \(n\) 是字符串的长度。空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|