P7858の题解

· · 题解

题意简述

给出一字符串,判断其是否能与给定的字符串输入顺序相符。

题目分析

这种键盘问题通常要用到一个简单算法——构造数组,也就是大家所说的打表。

打表(用空间换时间)————一般是指将所有需要用到的结果先计算出来,然后后面需要用到时就可以直接查表获得。

那么本题所要保存的东西就是输入每个字母所需的按键,e.g. : 输入 a 需要按 2 ,那么就记为 x [1] = 2 ,以此类推。

如果这张表打好了,那么剩下的操作只剩下与给定的字符串比较,这里又有一个难点,输入的是字符串,要将其转化为数字比对,这里要用 ASCII 表。

由表可知,需判断的小写字母字符串需要 -a 也就是 -97 可以得到十进制数字(也就是可以进行比较的),给定的字符串要 -0 ,也就是 -48 得到十进制数字。

Code

#include<bits/stdc++.h>
using namespace std;
int x[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};//构造数组
char a[1001][1001],b[1001];
int main()
{
    int n,ans=0,len=0;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    cin>>b;len=strlen(b);
    for(int i=1;i<=n;i++)
    {
        int l=strlen(a[i]);
        if(l==len)
        {
            bool flag=true;
            for(int j=0;j<l;j++)if(x[a[i][j]-97]!=b[j]-48)
            flag=false; 
            if(flag)ans++;//判断并统计答案
        }
    }
    cout<<ans;
    return 0;
}

温馨提示:本题卡数组大小记得把数组开大点哦。