题目描述
给定一个小写字母组成的字符串 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. 调整分割点:如果三个子串的权重不相等,我们需要调整分割点。具体来说,如果第一个子串的权重小于等于第二个子串的权重,我们将第一个分割点向右移动一位;否则,我们将第二个分割点向右移动一位。这样,我们可以保证在尽可能短的时间内找到满足条件的分割点。
-
输出结果:最后,我们输出结果ÿ