华为机试在线训练-牛客网(14)删除字符串中出现次数最少的字符

题目描述

实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。


输入描述:

字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。



输出描述:

删除字符串中出现次数最少的字符后的字符串。


输入例子:
abcdd

输出例子:
dd
此题可以引用《华为机试在线训练-牛客网(12)密码验证合格程序》一文中衍生问题的一个思路,不过此处更简单,不需要统计子串重复情况而是统计字符重复情况,对于字符统计可以直接使用泛型算法count()。另外记录下重复次数最少的所有索引,根据索引号用“0”替换,再调用remove()算法删除所有为'0'的字符。

注意:此处不能直接用string::erase()循环删除pos位置的字符,因为每次根据pos删除一个字符后索引号已改变,下一次删除无效。

完整AC的代码如下:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    string inStr;
    while(getline(cin,inStr)){
            int tempCnt=0;
            int minCnt=100;
            vector<int > minPos;
            for(int i=0;i<inStr.size();i++){
                tempCnt= count(inStr.begin(),inStr.end(),inStr[i]);
                if(tempCnt<=minCnt){
                    if(tempCnt<minCnt)minPos.clear();
                    minCnt=tempCnt;
                    minPos.push_back(i);
                }

            }
            for(auto pos:minPos)
                inStr.replace(pos,1,"0");
             int pos;
             while((pos=inStr.find('0'))!=string::npos){
                    inStr.erase(pos,1);
             }
             cout<<inStr<<endl;
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrlturtle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值