开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
刷题的日常-2022年11月30号
一天一题,保持脑子清爽
判断字符串的两半是否相似
来自leetcode的 1704 题,题意如下:
给你一个偶数长度的字符串 s 。将其拆分成长度相同的两半,前一半为 a ,后一半为 b 。
两个字符串 相似 的前提是它们都含有相同数目的元音('a','e','i','o','u','A','E','I','O','U')。注意,s 可能同时含有大写和小写字母。
如果 a 和 b 相似,返回 true ;否则,返回 false 。
示例1:
输入:s = "book"
输出:true
解释:a = "bo" 且 b = "ok" 。a 中有 1 个元音,b 也有 1 个元音。所以,a 和 b 相似。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一个字符串
- 要求我们对字符串进行判断,将字符串分为前后两个部分,如果前后两块的元音字母数量相同,返回true,否则返回false
做题思路
题意也比较简单,就是将字符串拆为了两块,然后分别统计元音字符出现的次数,然后返回是否数量相同即可,步骤如下:
- 开辟一个数组用于标识元音字母
- 初始化元音数组
- 找到字符串中点的位置,然后往后进行扫描
- 扫描的过程中,中点索引 和 开始索引同时相加
- 如果是元音则加一,如果不是,不需要操作
- 最后返回两个统计值是否相同即可
代码实现
代码实现如下:
public class Solution {
static byte[] mask = new byte['z' + 1];
static {
mask['a'] = 1;
mask['e'] = 1;
mask['i'] = 1;
mask['o'] = 1;
mask['u'] = 1;
mask['A'] = 1;
mask['E'] = 1;
mask['I'] = 1;
mask['O'] = 1;
mask['U'] = 1;
}
public boolean halvesAreAlike(String s) {
int pre = 0, post = s.length() / 2;
int[] res = new int[2];
while (post < s.length()) {
res[0] += mask[s.charAt(pre++)];
res[1] += mask[s.charAt(post++)];
}
return res[0] == res[1];
}
}