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 

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;
}


题目类型

本题属于 贪心 + 计数 相关的算法题,主要涉及字符串操作和组合计数的思想。


解题思路
  1. 问题分析
    • 给定一个 01 字符串 s,允许交换 s[i]s[j] (i≠j),求能得到的不同字符串数目。
    • 本质上,每次交换都是让 01 互换位置,因此不同的交换方式只与 01 的相对数量有关,而与字符串的具体排列无关。
  2. 贪心 + 计数方法
    • 统计字符串 s01 的个数,分别记为 cnt0cnt1
    • 初始状态下,原始字符串本身就是一种情况。
    • 遍历字符串时:
      • 如果当前字符是 '0',那么它可以和之前出现的所有 '1' 进行交换,每次交换都会形成一个新的字符串,因此方案数增加 cnt1(之前出现的 1 的个数)。
      • 如果当前字符是 '1',那么它可以和之前出现的所有 '0' 进行交换,每次交换都会形成一个新的字符串,因此方案数增加 cnt0(之前出现的 0 的个数)。
    • 通过遍历一次字符串,我们就可以统计所有可能的交换方案数。

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。

你可能感兴趣的:(大厂笔试真题题解,算法,c++,面试,数据结构,贪心算法)