【甲级PAT】-1071 Speech Patterns (25分)-字符串处理+STL

本文探讨如何使用C++和Python实现一个算法,统计给定字符串中出现次数最多的由大小写字母和数字组成的合法单词,并按字典序优先。通过isalnum函数检查字符,tolower统一大小写,map数据结构用于存储和排序结果。
摘要由CSDN通过智能技术生成

文章目录

题目描述

1071 Speech Patterns (25分)

大小写字母+数字的组合才是合法的单词
输入一字符串,统计出现次数最多的合法单词。如果有并列的,那么输出字典序里面的第一个

思路

  1. 使用isalnum测试字符是否为英文(alpha character)或数字(numeric character)
  2. 使用tolower将大写字母转换成小写字母
  3. 注意string字符串拼接使用的是+
  4. 当遇到英文和数字以外的字符,说明之前已经构成了一个单词,需要将单词temp加入map中,但注意一定要当temp不为空的时候m[temp]++,因为temp为空也会被统计的
  5. 如果i已经到了最后一位,不管当前位是不是字母数字,都得将当前这个temp放到map里面
  6. 由于map默认按照key值从小到大排序,因此使用map<string,int>存储,按value值从大到小排序,当value值相等时,可以做到输出字典序里面的第一个
#include <bits/stdc++.h>

using namespace std;
map<string,int>m;
typedef pair<string,int>PAIR;
int cmp(PAIR a,PAIR b)
{
    return a.second>b.second;
}
int main()
{
    #ifdef ONLINE_JUDGE
    #else
        freopen("1.txt", "r", stdin);
    #endif
    string s,temp;
    getline(cin,s);
    int len=(int)s.length();
    for(int i=0;i<len;i++)
    {
        if(isalnum(s[i]))
        {
            s[i]=tolower(s[i]);
            temp+=s[i];
        }
        if(!isalnum(s[i])||i==len-1)
        {
            if(temp.length()!=0)
            m[temp]++;
            temp.clear();//清空
        }
    }
    vector<PAIR>vec(m.begin(),m.end());
    sort(vec.begin(),vec.end(),cmp);
    cout<<vec[0].first<<" "<<vec[0].second;
    return 0;
}

思考:若在出现次数相同的情况下,按字典序倒序输出,将cmp改成以下

int cmp(PAIR a,PAIR b)
{
    if(a.second!=b.second)
       return a.second>b.second;
    else return a.first<b.first;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值