不相同的字符串(挑战字符串中的算法)

2023-09-21 15:28:44

 

 

此题不容易考虑全部情况,对于未出现字母不够的情况,需要自己模拟假设一下,才会发现处理方法的玄妙 

// 分析题目不难发现,这道题其实和字符具体长啥样没关系
// 只和字母的个数有关系,所以我们只需统计字母的个数
// 总体思路分两个情况
// 第一个情况,若有不存在的字母
// 例如abab,除ab以外的字母都不存在,可以将两个a转化为单个z,以此类推
// 当所有字母都被占用的时候,那么就进入到第二种情况
// 把所有多出来的字符全都转化成某一个字母,比如a
// 此时的情况一定是a有n个,其他字母全是1个,我们只需要消除多余的a即可
// 每次删掉两个a,再转化成一个a,这样操作一次就少一个a
// 总会变成所有字母都只剩下一个的情况,即达成题意不重复
#include<iostream>
#include<vector>
#include <string>

using namespace std;

int n;
string s;

void solve() {
    while(n--) {
        cin >> s;
        vector<int> a(26, 0); //建立数组储存26个字母的出现次数
        for(int i = 0; i < s.size(); ++i) { //储存数据
            a[s[i] - 97]++;
        } 
        int cnt = 0;
        for(int i = 0; i < 26; ++i) {
            if(a[i] > 1) { // 找出用第一种情况要操作的次数
                int temp = a[i] / 2;
                cnt += temp;
                a[i] = a[i] - temp * 2; // 减去被删除的字母
            }
        } 
        int cnt0 = 0; // 统计此时未出现的字母个数
        for(int i = 0; i < 26; ++i) {
            if(a[i] == 0) {
                cnt0++;
            }
        }
        int ans;
        if(cnt > cnt0) { // 如果此时未出现字母的个数不够
            ans = cnt + (cnt - cnt0);
            // 第一个cnt代表第一种情况的操作次数
            // cnt - cnt0代表将所有未被消化的字母累加到a头上
            // 因每次操作会消除掉一个多余的a
            // 所以最终答案是 第一种情况的操作次数 + (第二种情况的操作次数)
        }
        else {
            ans = cnt;// 第一种情况可以容纳,那么操作次数就是答案
        }
        cout << ans << endl;
    }
}

int main() {
    while(cin >> n) {
        solve();
    }
    return 0;
}

 

更多推荐

Python绘制X-bar图和R图 | 统计过程控制SPC

X-bar图和R图是用于统计过程控制(SPC)的两种常用工具,用于监测过程的平均值和范围(变异性)。这些图有助于识别过程中的变化和异常,以便及时采取纠正措施。**X-bar图(平均值控制图)**显示了一系列样本的平均值,用于监测过程的平均值是否保持在可接受的范围内。X-bar图通常由以下几个要素组成:样本平均值:每个样

线程池的基本理解以及使用

首先线程池是一种管理和复用线程的机制,它可以用来提高多线程编程的效率和性能。线程池的概念:线程池是一种线程管理的机制,它通常由一个线程池管理器(ThreadPoolExecutor)和一组线程组成。线程池管理器负责创建、管理和调度线程。当任务到达时,线程池会从线程池中预先创建的线程中选一个来执行任务,如果没有空闲线程,

微调大型语言模型(一):为什么要微调(Why finetune)?

今天我们来学习Deeplearning.ai的在线课程微调大型语言模型(一)的第一课:为什么要微调(Whyfinetune)。我们知道像GPT-3.5这样的大型语言模型(LLM)它所学到的知识截止到2021年9月,那么如果我们向ChatGPT询问2022年以后发生的事情,它可能会产生“幻觉”从而给出错误的答案,再比如我

HTTP协议的请求方式有哪些

HTTP请求方式是指客户端向服务器发送请求时所使用的方法,常用的请求方式有GET、POST、PUT、DELETE、HEAD、OPTIONS等。这些请求方式各自有着不同的特点和用途,下面将逐一介绍。GET请求GET请求是最常用的请求方式,用于向服务器请求获取某个资源。GET请求的参数会附加在URL的后面,以问号(?)分隔

API接口大全:常用、热门、免费的都有

常用、热门、免费的第三方接口应有尽有…二次号查询:通过手机号查询是否二次入网,直连三大运营商,精准查询。反欺诈(羊毛盾):反机器欺诈,检测异常IP、异常手机号。IP应用场景-IPv4,IPv4应用场景是获取IP场景属性的在线调用接口,具备识别IP真人度,提升风控和反欺诈等业务能力。IP应用场景基于地理和网络特征的IP场

postgresql教程

postgreSQL教程目录postgreSQL创建数据库的方式:postgreSQL删除数据库的方式:PostgreSQL创建表格postgre删除表格:postgreSQLINSERTINTO语句postgreSQLSELECT语句:postgresql索引:什么情况下要避免使用索引?postgreSQL创建数据库

DC/DC模块升压电源直流可调高压输出隔离升压变换器5v12v24v转60V80V110V150V220V300V400V500V800V1000V

特点效率高达80%以上1*2英寸标准封装单电压输出价格低稳压输出工作温度:-40℃~+85℃阻燃封装,满足UL94-V0要求温度特性好可直接焊在PCB上应用HRBW2~40W系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、9~18V、及18~36V、36~72VDC标准(2:1)宽输入电

Go面试题:锁的实现原理sync-mutex篇

在Go中,主要实现了两种锁:sync.Mutex(互斥锁)以及sync.RWMutex(读写锁)。本篇主要给大家介绍sync.Mutex的使用和实现原理。文章目录为什么需要锁在Go中对于并发程序进行公共资源的访问的限制最常用的就是互斥锁(sync.mutex)的方式实现原理锁的两种模式注意事项为什么需要锁在高并发下或多

阿里云交互式建模(PAI-DSW)训练并微调推理ChatGLM模型

参考内容为《轻量微调和推理ChatGLM模型实践》点击“交互式建模(DSW)”,然后选择“创建实例”写上实例名称,然后选择GPU规格,选择“ecs.gn6v-c8g1.2xlarge(8vCPU,32GB)”页面往下拉选择“pytorch:1.12-gpu-py39-cu113-ubuntu20.04”这个官方镜像,然

数据分析-利用gpt进行电商平台用户细分专题分析(RFM模型)

promt1:假如你是某电商平台的资深数据分析师,现在要开展用户细分专题分析,目的是根据一些特征将用户分成不同类别,然后针对不同的人群采用精细化运营策略。请基于业务背景和目的,构建该专题分析框架output1:在电商平台中进行用户细分专题分析是一项复杂但非常有价值的任务。这样的分析可以帮助平台更精准地了解用户需求,从而

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度2023/9/1522:19https://blog.csdn.net/wb4916/article/details/12844729820221226编译Toybrick的TB-RK3588X开发板的Android12系统2-SDK

热文推荐