题目描述
给定一个小写字母组成的字符串 s,请找出字符串中两个不同位置的字符作为分割点,使得字符串分成三个连续子串且子串权重相等,注意子串不包含分割点。
若能找到满足条件的两个分割点,请输出这两个分割点在字符串中的位置下标,若不能找到满足条件的分割点请返回0,0。
子串权重计算方式为:子串所有字符的ASCII码数值之和。
输入描述
输入为一个字符串,字符串由a~z,26个小写字母组成,5 ≤ 字符串长度 ≤ 200。
输出描述
输出为两个分割点在字符串中的位置下标,以逗号分隔
备注
只考虑唯一解,不存在一个输入多种输出解的情况
用例
| 输入 | acdbbbca |
| 输出 | 2,5 |
| 说明 | 以位置2和5作为分割点,将字符串分割为ac,bb,ca三个子串,每一个的子串权重都为196,输出为:2,5 |
| 输入 | abcabc |
| 输出 | 0,0 |
| 说明 | 找不到符合条件的分割点,输出为:0,0 |
解题思路
-
读取输入字符串
-
计算前缀和数组:为了方便计算子串的权重,我们创建一个前缀和数组,数组的每个元素表示从输入字符串的起始位置到当前位置的字符权重之和。权重可以是字符的 ASCII 码值。这样,我们可以通过前缀和数组快速计算任意子串的权重。
-
初始化结果和分割点:我们初始化结果为 “0,0”,表示没有找到满足条件的分割点。同时,我们初始化两个分割点,第一个分割点为 1,第二个分割点为 3。
-
遍历分割点:我们使用一个循环来遍历所有可能的分割点组合。在每次循环中,我们计算三个子串的权重,然后根据子串权重来调整分割点。
a. 计算三个子串的权重:我们使用前缀和数组来计算三个子串的权重。具体来说,我们分别计算从起始位置到第一个分割点、从第一个分割点到第二个分割点、从第二个分割点到字符串末尾的子串权重。
b. 判断是否满足条件:如果三个子串的权重相等,说明我们找到了满足条件的分割点。此时,我们更新结果为当前分割点组合,并跳出循环。
c. 调整分割点:如果三个子串的权重不相等,我们需要调整分割点。具体来说,如果第一个子串的权重小于等于第二个子串的权重,我们将第一个分割点向右移动一位;否则,我们将第二个分割点向右移动一位。这样,我们可以保证在尽可能短的时间内找到满足条件的分割点。
-
输出结果:最后,我们输出结果,即满足条件的分割点组合。如果没有找到满足条件的分割点,结果将保持为 “0,0”。
C++
#include

本文详细解析华为OD统一考试B卷中的一道字符串划分题目,涉及C++、Java、JavaScript和Python四种语言的解题思路及完整用例。题目要求找到使字符串分为三段权重相等的分割点,若存在则输出位置,否则返回0,0。"
132259180,11562258,JavaScript浏览器环境与优化:BOM、回流重绘、定时器与防抖,"['javascript', '浏览器环境', '回流重绘', '定时器', '性能优化']
订阅专栏 解锁全文
369

被折叠的 条评论
为什么被折叠?



