题目## 题目
#题解
##难度:简单
##知识点:逻辑与理解
这道题认真读完题目则发现很简单,因为漂亮的砖块最多存在一对不同颜色的相邻砖块。
所以只有三种情况:
- 如果有两种颜色以上,那么不可能组成漂亮砖块
- 只有两种颜色例如AB,那么排列有AB和BA,所以两种排列方式
- 只有一种颜色,那么只有一种排列方式
颜色对应不同的字母,为了对于找出字母的种类,就立即想到set元素不能重复的特点,所以根据set的size就得到字母的种类数
#include <iostream>
#include <string>
#include <set>
using namespace std;
int main()
{
string s;
getline(cin, s);
set<char> good;
for (int i = 0; i < s.length(); i++)
good.insert(s[i]);
if (good.size() == 1)
cout << 1 << endl;
else if (good.size() == 2)
cout << 2 << endl;
else
cout << 0 << endl;
}
解题思路
这道题要求计算满足条件的排列方式数量,关键点是:
- 每个字母代表一种颜色
- 相邻砖块颜色不能相同
- 排列方式相同的定义是:颜色序列相同
- 需要找到最多只有一对不同颜色相邻的排列方式数量
解题步骤:
- 统计字符串中不同字符的数量
- 如果字符种类超过2个,输出0(因为必然会有多于一对不同颜色相邻)
- 如果只有1种字符,输出1(只有一种排列方式)
- 如果有2种字符,输出2(可以从两端开始排列,得到两种不同的排列)
代码
#include <iostream>
#include <string>
#include <set>
using namespace std;
int main() {
string s;
cin >> s;
// 使用set统计不同字符的数量
set<char> chars;
for(char c : s) {
chars.insert(c);
}
// 根据不同字符数量判断结果
if(chars.size() > 2) {
cout << 0 << endl; // 超过2种颜色必然有多对不同颜色相邻
} else if(chars.size() == 2) {
cout << 2 << endl; // 2种颜色可以有两种排列方式
} else {
cout << 1 << endl; // 1种颜色只有一种排列方式
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
// 使用HashSet统计不同字符的数量
Set<Character> chars = new HashSet<>();
for(char c : s.toCharArray()) {
chars.add(c);
}
// 根据不同字符数量判断结果
if(chars.size() > 2) {
System.out.println(0); // 超过2种颜色必然有多对不同颜色相邻
} else if(chars.size() == 2) {
System.out.println(2); // 2种颜色可以有两种排列方式
} else {
System.out.println(1); // 1种颜色只有一种排列方式
}
}
}
s = input()
# 使用set统计不同字符的数量
chars = set(s)
# 根据不同字符数量判断结果
if len(chars) > 2:
print(0) # 超过2种颜色必然有多对不同颜色相邻
elif len(chars) == 2:
print(2) # 2种颜色可以有两种排列方式
else:
print(1) # 1种颜色只有一种排列方式
算法及复杂度
- 算法:使用集合统计不同字符数量。
- 时间复杂度: O ( n ) \mathcal{O}(n) O(n),其中 n n n 是字符串长度。
- 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1),最多存储 26 26 26 个不同的字符。

被折叠的 条评论
为什么被折叠?



