对于汉语拼音,你真的了解吗

· · 算法·理论

U513346 小怡同学的特殊称呼 自创题地址

我们班有个小姑娘,对大家挺“好”的,只是有的时候喜欢“抽风”,就比如称呼别人的时候把别人第二个字改成“小”,本人的这道题也是源于这个真实的小趣闻

说回题目,这题固定是三个字的名字,而且你也可以理解为提取出第一个字,第三个字,其实是方便大家去找规律的。你要是硬把所有的拼音组合都找出来,反而是麻烦的写法。

汉语拼音通常为声母加韵母(当然也有像 'ang 这种的),其中韵母无非由a,o,e,i,u,v组成,有的后面再加一个nng就结束了。

第一个字的提取,从字符串0位置开始排查,遇到韵母所属字母就标记,再遇到声母所属字母就结束,遇到n,ng特判以下,问题应该不大。

第三个字的提取,从(n-1)位置往前排查,遇到除h的声母所在字母直接停止,遇到h再特判前面一位是不是z,c,s即可。

直接上代码,自己稍微改良了一下,解决了二三字之间gh的问题。

#include <bits/stdc++.h>
using namespace std;
string s,s1,s2="xiao",s3;
bool a['z'+1],vis,vi2;
int main()
{
    a['a']=a['e']=a['i']=a['o']=a['u']=a['v']=1;
    cin>>s;
    for(int i=0;i<s.size();++i){
        if(a[s[i]]) vis=1;
        else if(vis){
            if(!a[s[i]]){
                if(s[i]=='g'){
                    if(a[s[i+1]]) break;
                }else if(s[i]=='n'){
                    if(a[s[i+1]]){
                        cout<<s[i+1]<<" "<<a[s[i+1]]<<endl; 
                        break;
                    } 
                }else break;
            }
        }
        s1+=s[i];
    }

    for(int i=s.size()-1;i>=0;--i){
        if(a[s[i]]) vi2=1;
        else if(vi2){
            if(!a[s[i]]){
                if(s[i]=='h'){
                    s3=s[i]+s3;
                    //这样写就错了:if(!a[s[i-1]]) s3=s[i-1]+s3;
                    if(s[i-1]=='z' or s[i-1]=='c' or s[i-1]=='s') s3=s[i-1]+s3;
                    break;
                }else {
                    s3=s[i]+s3;
                    break;
                }
            }
        }
        s3=s[i]+s3;
    }
    cout<<s1<<s2<<s3;
    return 0;
}

这道题主要就是字符串的基本操作,重点在于能否找出这个“显而易见”的规律。(虽然我们的主人公小怡同学对这一点不感兴趣)