刷题的日常-判断字符串的两半是否相似

120 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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];
    }
}

image.png