Easy

题目描述

给定一个偶数长度的字符串 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 个元音字母。因此,它们相似。

示例 2:

输入:s = "textbook"
输出:false
解释:a = "text" 和 b = "book"。a 有 1 个元音字母,而 b 有 2 个元音字母。因此,它们不相似。
注意元音字母 o 被计算了两次。

提示:

  • 2 <= s.length <= 1000
  • s.length 是偶数
  • s 由大写和小写字母组成

解题思路

这是一道简单的字符串处理题目,核心思路是统计字符串两半部分的元音字母数量。

解题思路:

  1. 字符串分割:将字符串从中间分成两个相等的部分
  2. 元音统计:分别统计前半部分和后半部分的元音字母数量
  3. 比较结果:判断两部分元音数量是否相等

具体实现方法:

  • 方法一(推荐):使用集合存储元音字母,遍历字符串的前半部分和后半部分,分别统计元音数量
  • 方法二:使用字符串查找函数判断是否为元音
  • 方法三:使用字符判断语句逐个检查

优化点:

  • 可以在一次遍历中同时处理前半部分和后半部分
  • 使用集合或哈希表存储元音字母可以提高查找效率
  • 前半部分元音+1,后半部分元音-1,最后判断计数器是否为0

推荐使用方法一,代码简洁且效率较高。

代码实现

class Solution {
public:
    bool halvesAreAlike(string s) {
        unordered_set<char> vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
        int n = s.length();
        int count = 0;
        
        for (int i = 0; i < n / 2; i++) {
            if (vowels.count(s[i])) count++;
            if (vowels.count(s[i + n / 2])) count--;
        }
        
        return count == 0;
    }
};
class Solution:
    def halvesAreAlike(self, s: str) -> bool:
        vowels = set('aeiouAEIOU')
        n = len(s)
        count = 0
        
        for i in range(n // 2):
            if s[i] in vowels:
                count += 1
            if s[i + n // 2] in vowels:
                count -= 1
        
        return count == 0
public class Solution {
    public bool HalvesAreAlike(string s) {
        HashSet<char> vowels = new HashSet<char> {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
        int n = s.Length;
        int count = 0;
        
        for (int i = 0; i < n / 2; i++) {
            if (vowels.Contains(s[i])) count++;
            if (vowels.Contains(s[i + n / 2])) count--;
        }
        
        return count == 0;
    }
}
/**
 * @param {string} s
 * @return {boolean}
 */
var halvesAreAlike = function(s) {
    const vowels = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']);
    const mid = s.length / 2;
    let firstHalfVowels = 0;
    let secondHalfVowels = 0;
    
    for (let i = 0; i < mid; i++) {
        if (vowels.has(s[i])) firstHalfVowels++;
        if (vowels.has(s[mid + i])) secondHalfVowels++;
    }
    
    return firstHalfVowels === secondHalfVowels;
};

复杂度分析

复杂度类型时间复杂度空间复杂度
总体O(n)O(1)

说明:

  • 时间复杂度:O(n),其中 n 是字符串长度。需要遍历字符串的一半,每次查找元音的时间复杂度为 O(1)
  • 空间复杂度:O(1),只使用了固定大小的集合存储元音字母,空间使用量与输入规模无关