PAT甲级1071 Speech Patterns(测试点2错误)以及关于unordered_map的一点说明

原题链接PAT甲级1071 Speech Patterns

坑点:

本题重新定义了单词。

The input contains at least one alphanumerical character, i.e., one character from the set [0-9 A-Z a-z].

以上是说有效字符是[0,9]、[a,z]、[A,Z],其余字符都可以看作是分隔符

Here a “word” is defined as a continuous sequence of alphanumerical characters separated by non-alphanumerical characters or the line beginning/end.

以上是说“word”是由连续的由有效字符组成的序列。
其实也就是说“aaa*aa”其实应该看做是两个单词,分别是“aaa”与“aa”,而不能看做一个整体。

错误思路

对于提取一行中的空格分割的单词,这是再简单不过的了,可以使用istringstream直接提取用空格分隔的单词。每当读到一个用空格分割的临时单词temp,之所以称其为临时单词,是因为此时temp中可能含有不符合条件的无效字符。比如说temp 为“can1?”,则其对应有效字符为“can1”、temp为“can!”则对应有效字符为“can"。
但是找temp中的有效字符时,不可以仅仅将有效字符全部取出然后串起来放到另一个串里面。
这样的话,第二个测试点必错。
因为有可能temp类似于“aaa*aa”,这样的话,temp中包含了两个有效单词“aaa”、“aa”。如果仅仅是遍历temp并将有效字符加起来,仅会得到一个单词“aaaaa”。这是第二个测试点出错的原因。

正确思路

首先读取一整行字符text,之后遍历text,在text中不断地找连续的有效字符,这样串联起来的单词才是符合题意的单词

#include <bits/stdc++.h>

using namespace std;

unordered_map<string,int> cnt;//统计单词出现次数
unordered_map<char,char> mp;//建立字符到字符的映射

void init(){
    
    //建立有效字符的映射,无效字符映射为默认的'\0'
    for(char c = '0';c <= '9';c++) mp[c] = c;
    for(char c = 'A';c <= 'Z';c++){
    
    
        char t = c + 32;
        mp[t] = t;
        mp[c] = t;
    }
}

int main()
{
    
    
    init();
    string text,ans;
    int opt = 0;
    getline(cin,text);
    for(int i = 0;i < text.size(); ){
    
    //注意这里不要让i自增
        if(i < text.size() && mp[text[i]] == '\0') i++;//如果text[i]为无效字符,则跳过
        else if(i < text.size()){
    
    //如果i<text.size(),即当前i处是一个有效字符
            int j = i;
            string temp;
            while(j < text.size() && mp[text[j]] != '\0'){
    
    //记录有效字符,串联起来作为单词
                temp += mp[text[j]];
                j++;
            }
            i = j;//重要,令i 变为 j,其实变为 j + 1也行,因为,j 处肯定是无效字符
            cnt[temp]++;//令有效单词temp的出现次数加1
            //下面就是对比,赋值给ans了
            if(cnt[temp] > opt){
    
    
                opt = cnt[temp];
                ans = temp;
            }
            else if(cnt[temp] == opt && temp < ans) ans = temp;
        }
    }

    cout<<ans<<' '<<opt;

    return 0;
}

关于unordered _map<key,value> mp

定义了一个无序unordered _map<key,value> mp或者有序的map<key,value> mp。
且value是一个基础类型,比如说int、char、bool。那么有两点需要注意

1、mp[x]
mp[x] :返回mp中key为x对应的value,而如果key为x的映射不存在,那么返回 value 类型的默认构造器(defaultconstructor)所构造的值,并该键值对插⼊到 mp 中。复杂度O(logn)
2、mp[key] = xxx
mp[key] = xxx:如果 mp 中找不到对应的 key, 则将键值映射 (key: xxx) 插⼊到 mp 中,如果存在 key 则将这个 key 对应的值改变为 xxx。复杂度 O(logn)

而当value为int时,默认映射值为0
为char时,默认映射值为’\0’
为bool时,默认映射值为false

猜你喜欢

转载自blog.csdn.net/weixin_44321570/article/details/114405534