1092 To Buy or Not to Buy(散列)

it2024-07-31  41

这类题目也有着常用的套路,写的多了,自然就熟悉了。

题目描述如下:

题目大致意思: 题目可以抽象为:给出两个字符串s1和s2,如果s1中包含s2中的所有的字符,则输出yes,并且输出s1中额外的字符数量,如果s1中没有包含s2中所有的字符,则输出no,并且输出缺少的字符数量。 大致思路: 这道题给出的时间限制是150ms,最直观的方法是双重for循环,但这个时候一定会有测试用例超过时间限制。可以用一个大小为62的整形数组,将出现的字符用一个函数转化成整数,对应数组的下标,在对s1进行遍历的时候,将出现的字符用一个函数转化成整数,并且整形数组对应的内容加一,这样一来就纪录了62种字符,每种字符出现的次数。接下来就是对s2进行遍历,每遍历一个,对应的整形数组相应的位置内容减一,如果减之前为零,则证明,s1中有不够用的字符,记录其数量即可。 提交结果如下: 提交的代码如下:

#include<iostream> #include<string> using namespace std; int hashfunc(char c); int main() { int queshao=0; int hashTable[62]={0}; string str1,str2; cin>>str1>>str2; for(int i=0;i<str1.size();i++) { hashTable[hashfunc(str1[i])]++; } for(int i=0;i<str2.size();i++) { if(hashTable[hashfunc(str2[i])]>0) hashTable[hashfunc(str2[i])]--; else queshao++; } if(queshao==0) { cout<<"Yes"<<" "<<str1.size()-str2.size()<<endl; } else cout<<"No"<<" "<<queshao<<endl; } int hashfunc(char c) { int result=0; if(c>='A'&&c<='Z') result=c-'A'; else if(c>='a'&&c<='z') result=c-'a'+26; else result=c-'0'+52; return result; }

本次提交后累计得分759。

最新回复(0)