算法题每日一练---第104天:26 个英文字母

221 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

一、问题描述

给定一个长度为 n 的由大小写英文字母构成的字符串。

请你判断,该字符串是否包含了全部 26 个英文字母?

注意,无论某个英文字母是以大写还是小写形式出现在字符串中,均视为该字符串包含此字母

题目链接:26 个英文字母

二、题目要求

样例 1

12
toosmallword
NO

样例 2

35
TheQuickBrownFoxJumpsOverTheLazyDog
YES

考察

1.字符串、哈希
2.建议用时10~25min

三、问题分析

这一题就是一个简单的字符串模拟分析问题,如果题目改成输入的字符串全部是小写的话,那我们可以直接使用哈希表map记录一下26个字母是否出现,出现置为1,默认值为0。

到最后,我们只需要遍历26个字母的哈希值,判断是否有0存在就可以了。

这一题,比较容易混淆的一个点就是字母的大小写问题,常规方法我们可以使用遍历判断。而对于C++丰富的STL库来说,只需要一个小小的调用,就可以完美解决问题。

  • 附录:

     定义一个字符串`s`=abcdEFGhijk
     transform(s.begin(),s.end(),s.begin(),::tolower);//字符串全部小写
     abcdefghijk
     transform(s.begin(),s.end(),s.begin(),::toupper);//字符串全部小写
     ABCDEFGHIJK
    

使用的时候,要注意填写头文件#include<cctype>//类库,或者图方便直接调用万能头文件 #include<bits/stdc++.h>OK了!

四、编码实现

#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include<cctype>//类库
using namespace std;
int main()
{
    int n;
    string s;
    cin>>n>>s;
    transform(s.begin(),s.end(),s.begin(),::tolower);//字符串全部小写
    map<char,int>m;
    for(int i=0;i<n;i++)//哈希标值
    {
        m[s[i]]=1;
    }
    for(char i='a';i<='z';i++)//计数判断
    {
        if(m[i]==0)
        {
            cout<<"NO";//输出结果
            return 0;
        }
    }
    cout<<"YES";
    return 0;
}

五、测试结果

1.png

19.png