题目链接在此。
思路及代码
非hash:
1. 需要一个bool型数组gflag,数组中的某一项如果为true则表示这一项的下标球已经被买; 需要一个count变量,存放还需要买几个球。
2. 在遍历第二个字符串的时候遍历第一个字符串,如果是要买的球,则标记上gflag数组相应的位置并且count–,如果没找到,则开始查询第二个串的下一个。
3. 最后,如果conut>0则表示还要珠子是需要买没买到的;count==0则表示买齐了,按照题目要求输出即可。
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
char goods[1010], buy[1010];
bool gflag[1010] = {false}; //标识是非被选定
gets(goods);
gets(buy);
int glen = strlen(goods);
int blen = strlen(buy);
int count = blen; //用来保存还需要买几颗珠子
for(int i = 0 ; i < blen; i++){
char b = buy[i];
int j;
for(j = 0; j < glen; j++){
char g = goods[j];
if(g == b && gflag[j]==false) { //是要买的珠子
count--;
gflag[j] = true; //标记为已被选定
break;
}
}
}
if(count == 0){ //都选到了,则可以买
printf("Yes %d\n",glen-blen);
}else{ //不能卖
printf("No %d\n",count);
}
return 0;
}
hash思路:
因为输入只会是大小写字母以及数字,所以讲这些字符一一对应到整数,用hashTable数组保存每个字符的个数,用miss变量保存缺少的字符个数;
遍历第二个字符串的时候,将相应的字符个数-1,如果个数小于零,则表明缺少了,则miss++。
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int change(char x){
if(x >= '0' && x <= '9') return x-'0';
else if(x >= 'A' && x <= 'Z') return x-'A'+10;
else return x-'a'+36;
}
int hashTable[1010] = {0};
int main(){
char str[1010];
int miss = 0;
//读入第一串
gets(str);
//记录每种颜色球的个数
int len1 = strlen(str);
for(int i = 0; i < len1; i++){
int index = change(str[i]);
hashTable[index]++;
}
//读入第二串
gets(str);
int len2 = strlen(str);
for(int i = 0 ; i < len2; i++){
int index = change(str[i]);
hashTable[index]--;
if(hashTable[index] < 0){ //缺少了这种颜色的球
miss++;
}
}
if(miss > 0){ //有缺少的球
printf("No %d\n",miss);
}else{ //都买到了
printf("Yes %d\n",len1-len2);
}
return 0;
}