第一篇题解

2021-06-27 19:44:49


题意简述

  • 先输入一些单词并告诉你这是什么语言。
  • 然后再给你几段句子,让你找出句子中单词的语言。

题目分析

思路:

看到这种字符串与其他东西一一对应的题,就能想到用 map

我们令 dict["key"] 表示 key 单词所属语言的编号。

要用的东西:

map<string, int> dict;
string lans[101];
int n;//语言数量
char c;//读入用字符
string m;//单词字符串

首先,读入 n 行。 对于每一行:

  • 将单词字符串 m 初始化为空。
  • 如果读到字母,就把字母加在 m 后面。
  • 如果读到空格,将 m 作为键存入 map 中,值为这个单词所属语言的下标。

(注意单词统一转为小写形式,因为不区分大小写)

for(int i=1; i<=n; i++){
        cin>>lans[i];
        m="";
        cin.get(c);
        while(1){
            cin.get(c);
            if(c==' '){//一个单词结束
                if(m=="") continue;//单词为空,舍去

                dict[m]=i;//存储单词所属语言的下标
                m="";//清空单词
                continue;
            }

            if(c=='\n' || c=='\r'){//一行结束(当前语言读完了)
                dict[m]=i;//存储
                m="";//清空单词
                break;
            }

            //转换大小写
            if(c>='a' && c<='z') m+=c;
            else if(c>='A' && c<='Z') m+=(c-'A'+'a');
            else m+=c;
        }
    }

然后,读入若干行(注意行中可能有空格,所以要用 getline )

每行以"." "," "?" "!" ";" "(" ")" 空格和换行作为分隔符分出单词(用 check 函数实现)。

bool check(char x){
    if(x!=' ' && x!='!' && x!='.' && x!='?' && x!=',' && x!=';' && x!='(' && x!=')') return true;//注意!要按题目所给方式分割字符
    return false;
}

然后在 map 里查找,如果找到,那就输出语言并换行,再读下一行。

    string inp="",t="";
    while(getline(cin, inp)){
        if(inp==string()) continue;//读入空行,舍去
        if(inp[inp.length()-1]=='\r') //有奇怪的字符,舍去
            inp.erase(inp.length()-1);

        for(int i=0; i<inp.length() && inp.length(); i++){//开始搜了
            t="";//初始化
            while(check(inp[i]/*检验分隔符*/)&& i<inp.length()){
                if(inp[i]>='a' && inp[i]<='z') t+=inp[i];
                else if(inp[i]>='A' && inp[i]<='Z') t+=(inp[i]-'A'+'a');
                else t+=inp[i];//转换大小写

                i++;
            }

            if(t=="") continue;//空单词,舍去

            if(dict[t]!=0){//搜到了
                cout<<lans[dict[t]]<<endl;//输出语言并换行
                break;//读下一行
            }

        }
    }