C++力扣每日一题-判断字符串的两半是否相似

这篇博客探讨如何通过Python实现一个解决方案,检查给定偶数长度字符串s的前半部分(a)与后半部分(b)是否含有相同数量的元音字母,以确定它们是否相似。代码展示了如何使用unordered_set来计数元音并比较两者之间的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
给你一个偶数长度的字符串 s 。将其拆分成长度相同的两半,前一半为 a ,后一半为 b 。
两个字符串 相似 的前提是它们都含有相同数目的元音(‘a’,‘e’,‘i’,‘o’,‘u’,‘A’,‘E’,‘I’,‘O’,‘U’)。注意,s 可能同时含有大写和小写字母。
如果 a 和 b 相似,返回 true ;否则,返回 false 。

思路:
遍历字符串 s,若字符串前半段的元音个数等于后半段的元音个数,则返回 true,否则返回 false。

代码:

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;
    }
};
<think>好的,我现在需要帮用户找到LeetCode一题“两数之和”的C++测试代码示例。首先,我得回忆一下这个问题的大致要求。题目是给定一个整数数组和一个目标值,找出数组中两个数的和等于目标值,并返回它们的下标。每个输入应该只有一个解,且同一个元素不能使用两次。 用户需要的是测试代码示例,而不仅仅是解法。所以我要确保提供的代码不仅包括解决方案,还有测试用例。通常,LeetCode的问题会要求函数返回答案,但用户可能需要一个完整的可运行示例,包括main函数中的测试代码。 接下来,我需要检查现有的引用内容。用户提供的引用中有几个关于LeetCode的问题,比如引用[1]、[2]、[3]、[4]。其中引用[1]提到了LeetCode问题集算法题第一题的描述,但具体的代码示例可能没有直接给出。引用[2]是关于两数之和的位操作解法,引用[3]是关于字符串相加的问题,引用[4]是关于链表相加的问题。看起来这些引用中并没有直接给出两数之和的C++测试代码,但可能需要根据问题描述来构造。 因此,我需要自己构造一个符合要求的C++测试代码示例。首先,解决方案通常是一个函数,比如vector<int> twoSum(vector<int>& nums, int target)。然后,测试部分需要调用这个函数,并验证输出是否正确。 我需要确保代码的正确性。通常两数之和的解法可以用哈希表来优化时间复杂度到O(n),而暴力解法则是O(n²)。这里应该提供最优解,即哈希表的实现。然后,测试用例需要包括一些基本的情况,比如示例输入,比如nums = [2,7,11,15], target = 9,应该返回[0,1]。可能还需要其他测试用例,比如有重复元素或者负数的情况。 另外,测试代码需要包括断言或者输出结果的验证。比如在main函数中调用twoSum函数后,打印结果并与预期比较。或者使用assert语句来确保正确性。 还要注意代码格式,比如正确的缩进,头文件的包含(比如#include <vector>, #include <unordered_map>, #include <iostream>等)。同时,main函数的结构应该正确,可能有多个测试用例。 现在,我需要将这些元素整合成一个完整的示例。例如,先写twoSum函数的实现,然后在main函数中定义测试用例,调用函数,输出结果。同时,确保代码符合C++标准,能够编译运行。 可能还需要处理一些边界情况,比如空数组或者无解的情况,但根据题目描述,每个输入恰好有一个解,所以测试用例可以不用考虑这些。但为了代码的健壮性,可能需要添加注释说明。 最后,根据用户的要求,生成相关问题。比如关于时间空间复杂度,优化方法,或者不同解法比较的问题。确保问题与当前主题相关,并且能帮助用户深入理解。</think>关于LeetCode一题"两数之和"的C++测试代码示例如下,包含核心算法和测试案例: ```cpp #include <vector> #include <unordered_map> #include <iostream> using namespace std; vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> num_map; for (int i = 0; i < nums.size(); ++i) { int complement = target - nums[i]; if (num_map.find(complement) != num_map.end()) { return {num_map[complement], i}; } num_map[nums[i]] = i; } return {}; } // 测试代码 int main() { // 测试案例1 vector<int> nums1 = {2,7,11,15}; int target1 = 9; vector<int> result1 = twoSum(nums1, target1); cout << "Test Case 1: [" << result1[0] << ", " << result1[1] << "]" << endl; // 测试案例2(包含负数) vector<int> nums2 = {-1, -2, -3, -4}; int target2 = -7; vector<int> result2 = twoSum(nums2, target2); cout << "Test Case 2: [" << result2[0] << ", " << result2[1] << "]" << endl; // 测试案例3(重复元素) vector<int> nums3 = {3, 2, 4}; int target3 = 6; vector<int> result3 = twoSum(nums3, target3); cout << "Test Case 3: [" << result3[0] << ", " << result3[1] << "]" << endl; return 0; } ``` 算法实现要点: 1. 使用哈希表存储`<数值, 索引>`的映射关系,时间复杂度$O(n)$,空间复杂度$O(n)$ 2. 通过计算补数`target - nums[i]`快速定位匹配元素 3. 单次遍历即可完成查找,避免暴力解法的$O(n^2)$时间复杂度[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值