题解:P13593 [NWRRC 2023] Missing Vowels

· · 题解

题目传送门

分析

题目就是让我们判断短名称 s 是否可以通过从全名称 f省略部分元音字母得到。

算法

这题有什么算法呢?

核心函数解析

bool pdxt(char a,char b)
{
    return tolower(a)==tolower(b);// 不区分大小写的字符比较
    //int tolower() :头文件cstring 的库函数,将字符转化为小写字母
}
bool pdyi(char a)
{
    a=tolower(a);
    return a=='a'||a=='e'||a=='i'||a=='o'||a=='u'||a=='y';\\检测元音字母
}
bool cmpar(char* s,char* f)
{
    while (*s&&*f)// 双指针遍历
    {
        if (pdxt(*f,*s)) s++, f++;// 字符匹配
        else if (pdyi(*f)) f++; // 跳过f中的元音
        else return false;// 不匹配且非可省略字符
    }
    while (*f&&pdyi(*f)) f++;// 处理f剩余元音
    return !*s&&!*f;// 检查是否同时遍历完毕
}

完整纯净版代码 awa

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
bool f;
int i,j;
char s1[1005],f1[1005];
bool pdxt(char a,char b)
{
    return tolower(a)==tolower(b);
}
bool pdyi(char a)
{
    a=tolower(a);
    return a=='a'||a=='e'||a=='i'||a=='o'||a=='u'||a=='y';
}
bool cmpar(char* s,char* f)
{
    while (*s&&*f)
    {
        if (pdxt(*f,*s)) s++, f++;
        else if (pdyi(*f)) f++;
        else return false;
    }
    while (*f&&pdyi(*f)) f++;
    return !*s&&!*f;
}
int main()
{
    cin>>s1;
    cin>>f1;
    cout<<(cmpar(s1,f1)?"Same":"Different");
    return 0;
}

被 120 个测试点震惊到了 QoQ