三带一【算法赛】
https://www.lanqiao.cn/problems/5127/learning/?contest_id=144
小蓝和小桥玩斗地主,小蓝只剩四张牌了,他想知道是否是“三带一”牌型。

所谓“三带一”牌型,即四张手牌中,有三张牌一样,另外一张不与其他牌相同,换种说法,四张手牌经过重新排列后,可以组成 AAAB 型。
第一行输入一个整数 T ,代表斗地主的轮数。
接下来 T 行,每行输入一个长度为 44 的字符串,代表小蓝的手牌。
字符 { 'A','2','3','4','5','6','7','8','9','X','J','Q','K' } 对应代表牌面 { A,2,3,4,5,6,7,8,9,10,J,Q,K } 。
牌面中不包含大小王。
输出 T 行,每行一个字符串,如果当前牌是“三带一”牌型,输出 Yes ,否则输出 No 。
- 5
- AAAA
- 33X3
- JQKX
- 6566
- KKKQ
- No
- Yes
- No
- Yes
- Yes
“四炸”牌型不属于“三带一”牌型。
数据范围:1≤501≤T≤50 。
字符中只包含:{ A,2,3,4,5,6,7,8,9,X,J,Q,K } 。
| 语言 | 最大运行时间 | 最大运行内存 |
|---|---|---|
| C++ | 1s | 256M |
| C | 1s | 256M |
| Java | 2s | 256M |
| Python3 | 3s | 256M |
| PyPy3 | 3s | 256M |
总通过次数: 2697 | 总提交次数: 4096 | 通过率: 65.8%
难度: 中等
#include:包含输入输出流库,提供与标准输入输出设备的接口。#include:包含无序哈希映射库,用于存储字符和对应的出现次数。using namespace std:使用std命名空间,简化对标准库的调用。int main():主函数,程序的入口。int t;:声明一个整型变量t,用于记录测试用例的数量。string str;:声明一个字符串变量str,用于记录输入的字符串。cin >> t;:从标准输入读取一个整数,赋值给变量t。for (int i = 0; i < t; i++) { ... }:循环t次,执行测试用例。cin >> str;:从标准输入读取一个字符串,赋值给变量str。bool flag = false;:声明一个布尔型变量flag,用于标记是否存在出现次数为3的字符。unordered_map:声明一个无序哈希映射,用于存储字符和对应的出现次数。map; for (int j = 0; str[j]; j++) { ... }:遍历字符串中的每个字符,统计字符出现的次数。map[str[j]]++;:将字符str[j]作为键,在哈希映射map中查找并使对应的值加1。for (auto &x : map) { ... }:遍历哈希映射map,查找出现次数为3的字符。if (x.second == 3) { ... }:如果字符的出现次数为3,则将flag设为true,并退出循环。if (flag == true):如果flag为true,即存在出现次数为3的字符。cout << "Yes" << endl;:输出"Yes"到标准输出。else:否则,即不存在出现次数为3的字符。cout << "No" << endl;:输出"No"到标准输出。return 0;:返回0,表示程序正常结束。
O(n)
时间复杂度为O(n),其中n是输入字符串的长度。代码中有两个嵌套循环,分别遍历字符串和哈希映射,但每个字符只会被遍历一次,因此总体上是线性时间复杂度。
O(k)
空间复杂度为O(k),其中k是字符串中不同字符的数量。代码使用了一个无序哈希映射来存储字符和对应的出现次数,最坏情况下会存储所有不同的字符,因此空间复杂度为O(k)。另外还有几个变量和固定大小的辅助空间,对总体空间复杂度的影响很小。
- #include
- #include
- using namespace std;
-
- int main() {
- int t; // 用于记录测试用例的数量
- string str; // 用于记录输入的字符串
- cin >> t;
-
- for (int i = 0; i < t; i++) {
- cin >> str; // 输入字符串
- bool flag = false; // 用于标记是否存在出现次数为3的字符
- unordered_map<char, int> map; // 使用无序哈希映射存储字符和对应的出现次数
-
- // 遍历字符串中每个字符,统计字符出现的次数
- for (int j = 0; str[j]; j++) {
- map[str[j]]++; // 字符出现次数加1
- }
-
- // 遍历哈希映射,查找出现次数为3的字符
- for (auto &x : map) {
- if (x.second == 3) { // 字符出现次数为3
- flag = true;
- break;
- }
- }
-
- // 输出结果
- if (flag == true)
- cout << "Yes" << endl; // 如果存在出现次数为3的字符,则输出"Yes"
- else
- cout << "No" << endl; // 如果不存在出现次数为3的字符,则输出"No"
- }
-
- return 0;
- }
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。