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,后半部分元音-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),只使用了固定大小的集合存储元音字母,空间使用量与输入规模无关