题目链接:https://www.nowcoder.com/acm/contest/107/B
我的思路可能有点麻烦,我先开个数组去存初字符串的各个字母的出现的个数,然后再用一个数组去存下面输入的字符串的各个字母出现的个数,然后遍历下面的字符串,只有当下面的字符串的字母个数都小于等于初字符串的对应字母的出现个数才能讲这个拼出来,然后更新最长串就好了。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[1005],b[1005];
string str1,str2;
int n,sum;
int main()
{
while(cin>>str1){
sum = 0;
int len1 = str1.length();
memset(a,0,sizeof(a));
for(int i=0;i<len1;i++){
a[str1[i]]++;
}
scanf("%d",&n);
while(n--){
cin>>str2;
int len2 = str2.length();
memset(b,0,sizeof(b));
for(int i=0;i<len2;i++){
b[str2[i]]++;
}
int flag = 0;
for(int i=0;i<len2;i++){
if(b[str2[i]] > a[str2[i]]){
flag = 1;
break;
}
}
if(!flag)sum = max(sum,len2);
}
printf("%d\n",sum);
}
return 0;
}