华为OD统一考试 - 字符串划分(C++ Java JavaScript Python)

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

题目描述

给定一个小写字母组成的字符串 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

解题思路

  1. 读取输入字符串

  2. 计算前缀和数组:为了方便计算子串的权重,我们创建一个前缀和数组,数组的每个元素表示从输入字符串的起始位置到当前位置的字符权重之和。权重可以是字符的 ASCII 码值。这样,我们可以通过前缀和数组快速计算任意子串的权重。

  3. 初始化结果和分割点:我们初始化结果为 “0,0”,表示没有找到满足条件的分割点。同时,我们初始化两个分割点,第一个分割点为 1,第二个分割点为 3。

  4. 遍历分割点:我们使用一个循环来遍历所有可能的分割点组合。在每次循环中,我们计算三个子串的权重,然后根据子串权重来调整分割点。

    a. 计算三个子串的权重:我们使用前缀和数组来计算三个子串的权重。具体来说,我们分别计算从起始位置到第一个分割点、从第一个分割点到第二个分割点、从第二个分割点到字符串末尾的子串权重。

    b. 判断是否满足条件:如果三个子串的权重相等,说明我们找到了满足条件的分割点。此时,我们更新结果为当前分割点组合,并跳出循环。

    c. 调整分割点:如果三个子串的权重不相等,我们需要调整分割点。具体来说,如果第一个子串的权重小于等于第二个子串的权重,我们将第一个分割点向右移动一位;否则,我们将第二个分割点向右移动一位。这样,我们可以保证在尽可能短的时间内找到满足条件的分割点。

  5. 输出结果:最后,我们输出结果,即满足条件的分割点组合。如果没有找到满足条件的分割点,结果将保持为 “0,0”。

C++

#include 
题目描述: 给定一个字符串 s ,请你找出其中最长的不含重复字符的子串长度。 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 思路分析: 用一个 hash 表存储每个字符最后一次出现的位置。遍历字符串,记录当前子串的起始位置 start 和当前位置 i,当遇到重复字符时,更新 start 的位置。最后更新最长子串的长度。 代码实现: Python: class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ hash_map = {} res = 0 start = 0 for i in range(len(s)): if s[i] in hash_map and hash_map[s[i]] >= start: start = hash_map[s[i]] + 1 hash_map[s[i]] = i res = max(res, i - start + 1) return res Java: class Solution { public int lengthOfLongestSubstring(String s) { int[] hash_map = new int[256]; int res = 0; int start = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (hash_map[c] >= start) { start = hash_map[c] + 1; } hash_map[c] = i; res = Math.max(res, i - start + 1); } return res; } } C++: class Solution { public: int lengthOfLongestSubstring(string s) { vector<int> hash_map(256, -1); int res = 0; int start = 0; for (int i = 0; i < s.size(); i++) { char c = s[i]; if (hash_map[c] >= start) { start = hash_map[c] + 1; } hash_map[c] = i; res = max(res, i - start + 1); } return res; } }; 总结: 这道题考察了字符串的基础操作和 hash 表的使用。通过本题的练习,可以在实际开发中更加熟练地使用 hash 表,提高代码效率和可读性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值