题意:
其实就是找匹配,先给定n个字符串形成一个字典库,然后再给你任意一个字符串,问你这个字符串经过字符随意组合能形成多少个字典库里面匹配的字符串。
思路:
因为字符串最长长度为6,库的大小最大为100,所以时间复杂度上要求很松。
不需要什么算法处理,简单的匹配模拟即可。
一次AC。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#define max(a,b) (a>b?a:b)
#define abs(a) ((a)>0?(a):-(a))
#define min(a,b) (a<b?a:b)
using namespace std;
const int N=105;
int n,m;
char a[N][8];
char t[8];
bool vis[8];
int main()
{
while(scanf("%s",a[++n]),strcmp(a[n],"XXXXXX"));
n--;
while(scanf("%s",t),strcmp(t,"XXXXXX"))
{
vector<string> vec;
int len=strlen(t);
for(int i=1;i<=n;i++)//遍历数组a寻找匹配对象
{
if(strlen(a[i])==len)//条件1:长度相等
{
memset(vis,0,sizeof(vis));
int j=0;
while(j<len)//条件2:遍历每个字符都可以在目标字符串里面的不同位置找到。
{
bool flag=false;
for(int k=0;k<len;k++)
{
if(!vis[k]&&a[i][j]==t[k])
{
vis[k]=true;
j++;
flag=true;//表示该字符已匹配
break;
}
}
if(!flag)
{
break;
}
}
if(j==len)
{
vec.push_back(a[i]);
}
}
}
if(vec.empty())
printf("NOT A VALID WORD\n");
else
{
if(vec.size()>1)
sort(vec.begin(),vec.end());
for(vector<string>::iterator iter=vec.begin();iter!=vec.end();iter++)
cout<<*iter<<endl;
}
printf("******\n");
}
return 0;
}