T1.小红的字符串 - 饿了么
题目描述
小红拿到了一个01串s。她将进行恰好一次以下操 作:
选择下标 i,j(i≠j)
,交换s[i]和s[j]。
小红想知道,不同的操作方案,最终能生成多少不 同的字符串?
输入描述
一个仅由'0'和'1'构成的字符串。字符串长度不小于2,不大于200000。
输出描述
一个整数,代表最终的方案数。
示例1
输入:
1100
输出:
5
说明:
共有以下5种不同字符串:
交换第一个和第二个字符,形成1100
交换第二个和第三个字符,形成1010
交换第二个和第四个字符,形成1001
交换第一个和第三个字符,形成0110
交换第一个和第四个字符,形成0101
C++
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
long long ans = 1; // 当前字符串算一个
int cnt0 = 0, cnt1 = 0;
for (char ch: s) {
// 当前的 ‘0' 和之前的 '1' 交换可以形成新的字符串
if (ch == '0') {
ans += cnt1;
cnt0++;
} else { // 当前的 ‘1' 和之前的 '0' 交换可以形成新的字符串
ans += cnt0;
cnt1++;
}
}
cout << ans << endl;
return 0;
}
题目类型
本题属于 贪心 + 计数 相关的算法题,主要涉及字符串操作和组合计数的思想。
解题思路
- 问题分析
- 给定一个
01
字符串s
,允许交换s[i]
和s[j] (i≠j)
,求能得到的不同字符串数目。- 本质上,每次交换都是让
0
和1
互换位置,因此不同的交换方式只与0
和1
的相对数量有关,而与字符串的具体排列无关。- 贪心 + 计数方法
- 统计字符串
s
中0
和1
的个数,分别记为cnt0
和cnt1
。- 初始状态下,原始字符串本身就是一种情况。
- 遍历字符串时:
- 如果当前字符是
'0'
,那么它可以和之前出现的所有'1'
进行交换,每次交换都会形成一个新的字符串,因此方案数增加cnt1
(之前出现的1
的个数)。- 如果当前字符是
'1'
,那么它可以和之前出现的所有'0'
进行交换,每次交换都会形成一个新的字符串,因此方案数增加cnt0
(之前出现的0
的个数)。- 通过遍历一次字符串,我们就可以统计所有可能的交换方案数。
#春招##校招##面经##C++##笔试#整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏
C++笔试真题题解 文章被收录于专栏
笔试真题题解