1422.分割字符串的最大得分
【LetMeFly】1422.分割字符串的最大得分
力扣题目链接:https://leetcode.cn/problems/maximum-score-after-splitting-a-string/
给你一个由若干 0 和 1 组成的字符串 s
,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分。
「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。
示例 1:
输入:s = "011101" 输出:5 解释: 将字符串 s 划分为两个非空子字符串的可行方案有: 左子字符串 = "0" 且 右子字符串 = "11101",得分 = 1 + 4 = 5 左子字符串 = "01" 且 右子字符串 = "1101",得分 = 1 + 3 = 4 左子字符串 = "011" 且 右子字符串 = "101",得分 = 1 + 2 = 3 左子字符串 = "0111" 且 右子字符串 = "01",得分 = 1 + 1 = 2 左子字符串 = "01110" 且 右子字符串 = "1",得分 = 2 + 1 = 3
示例 2:
输入:s = "00111" 输出:5 解释:当 左子字符串 = "00" 且 右子字符串 = "111" 时,我们得到最大得分 = 2 + 3 = 5
示例 3:
输入:s = "1111" 输出:3
提示:
2 <= s.length <= 500
- 字符串
s
仅由字符'0'
和'1'
组成。
方法0:暴力
直接暴力枚举每一个可以分割的位置,在每次枚举时,暴力统计一下分割位置前面和后面分别有多少个’0’ / ‘1’
- 时间复杂度$O(n^2)$,其中$n$是字符串长度
- 空间复杂度$O(1)$
方法一:前缀和
1 |
|
方法二:直接计算
方法一中,我们通过预处理,先用两个数数组把第$i$个位置前后的零/一存了下来,因此消耗了$O(n)$的空间复杂度。
那么,我们有没有什么办法使用$O(1)$的额外空间来存储上述信息呢?
注意,方法一中模拟分割位置时是从前往后依次模拟的。也就是说,我们可以在上次模拟结果的基础上,快速求出这次的“零、一信息”
具体方法为:
首先遍历一遍原始字符串,并求出从第一个元素分割的情况下的得分。
之后从第二个元素开始往后模拟,如果这个元素是'0'
,那么把这个元素划分到“左字符串”的话,将会比上一种方案多一个“前字符串的0”,因此会在上一个方案的基础上多得一分
;同理,如果这个元素是“1”,那么“后字符串”将少一个“1”,将会少得一分
每次模拟分割位置并在上次分割的基础上计算出新的得分后,更新最大得分,就能得到答案。
- 时间复杂度$O(n)$,其中$n$是字符串的长度
- 空间复杂度$O(1)$
AC代码
C++
1 |
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126329351
1422.分割字符串的最大得分
https://blog.letmefly.xyz/2022/08/14/LeetCode 1422.分割字符串的最大得分/