comments | difficulty | edit_url | rating | source | tags | ||
---|---|---|---|---|---|---|---|
true |
Easy |
1207 |
Weekly Contest 221 Q1 |
|
You are given a string s
of even length. Split this string into two halves of equal lengths, and let a
be the first half and b
be the second half.
Two strings are alike if they have the same number of vowels ('a'
, 'e'
, 'i'
, 'o'
, 'u'
, 'A'
, 'E'
, 'I'
, 'O'
, 'U'
). Notice that s
contains uppercase and lowercase letters.
Return true
if a
and b
are alike. Otherwise, return false
.
Example 1:
Input: s = "book" Output: true Explanation: a = "bo" and b = "ok". a has 1 vowel and b has 1 vowel. Therefore, they are alike.
Example 2:
Input: s = "textbook" Output: false Explanation: a = "text" and b = "book". a has 1 vowel whereas b has 2. Therefore, they are not alike. Notice that the vowel o is counted twice.
Constraints:
2 <= s.length <= 1000
s.length
is even.s
consists of uppercase and lowercase letters.
Traverse the string. If the number of vowels in the first half of the string is equal to the number of vowels in the second half, return true
. Otherwise, return false
.
The time complexity is
class Solution:
def halvesAreAlike(self, s: str) -> bool:
cnt, n = 0, len(s) >> 1
vowels = set('aeiouAEIOU')
for i in range(n):
cnt += s[i] in vowels
cnt -= s[i + n] in vowels
return cnt == 0
class Solution {
public boolean halvesAreAlike(String s) {
Set<Character> vowels = Set.of('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U');
int n = s.length() >> 1;
int cnt = 0;
for (int i = 0; i < n; ++i) {
cnt += vowels.contains(s.charAt(i)) ? 1 : 0;
cnt -= vowels.contains(s.charAt(i + n)) ? 1 : 0;
}
return cnt == 0;
}
}
class Solution {
public:
bool halvesAreAlike(string s) {
unordered_set<char> vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
int cnt = 0, n = s.size() / 2;
for (int i = 0; i < n; ++i) {
cnt += vowels.count(s[i]);
cnt -= vowels.count(s[i + n]);
}
return cnt == 0;
}
};
func halvesAreAlike(s string) bool {
vowels := map[byte]bool{}
for _, c := range "aeiouAEIOU" {
vowels[byte(c)] = true
}
cnt, n := 0, len(s)>>1
for i := 0; i < n; i++ {
if vowels[s[i]] {
cnt++
}
if vowels[s[i+n]] {
cnt--
}
}
return cnt == 0
}
function halvesAreAlike(s: string): boolean {
const vowels = new Set('aeiouAEIOU'.split(''));
let cnt = 0;
const n = s.length >> 1;
for (let i = 0; i < n; ++i) {
cnt += vowels.has(s[i]) ? 1 : 0;
cnt -= vowels.has(s[n + i]) ? 1 : 0;
}
return cnt === 0;
}
impl Solution {
pub fn halves_are_alike(s: String) -> bool {
let n = s.len() / 2;
let vowels: std::collections::HashSet<char> = "aeiouAEIOU".chars().collect();
let mut cnt = 0;
for i in 0..n {
if vowels.contains(&s.chars().nth(i).unwrap()) {
cnt += 1;
}
if vowels.contains(&s.chars().nth(i + n).unwrap()) {
cnt -= 1;
}
}
cnt == 0
}
}
/**
* @param {string} s
* @return {boolean}
*/
var halvesAreAlike = function (s) {
const vowels = new Set('aeiouAEIOU'.split(''));
let cnt = 0;
const n = s.length >> 1;
for (let i = 0; i < n; ++i) {
cnt += vowels.has(s[i]);
cnt -= vowels.has(s[n + i]);
}
return cnt === 0;
};
class Solution {
/**
* @param String $s
* @return Boolean
*/
function halvesAreAlike($s) {
$n = strlen($s) / 2;
$vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'];
$cnt = 0;
for ($i = 0; $i < $n; $i++) {
if (in_array($s[$i], $vowels)) {
$cnt++;
}
if (in_array($s[$i + $n], $vowels)) {
$cnt--;
}
}
return $cnt == 0;
}
}