有序字符串搜索
内存限制:C/C++语言 204800KB;其他语言 729088KB
给定一些字符串,请写一个算法,从中搜索出包含您输入的字符序列的那些字符串,按匹配度的高低排序输出。没有任何一个字符串匹配上,输出-1。
字符串源source 如下:
"AB",
"ABC",
"ACB",
"ABCD",
"ADBCF",
"ABDCF",
"ABDC",
"ABDFCG",
"ABDFGC",
"ABDEFG",
"GABCEFG"
若输入查找的有序字符序列为"ABC",则运算结果如下(请注意结果的排序规则)。
ABC (匹配 ABC)(完全匹配上,匹配度最大)
ABCD (匹配 ABC.)
ABDC (匹配 AB.C)
ABDCF (匹配 AB.C.)
ABDFCG (匹配 AB..C.)
ABDFGC (匹配 AB...C)
ADBCF (匹配 A.BC.)
GABCEFG(匹配 .ABC...)
您需要查找的字符串
ABC
ABC
ABCD
ABDC
ABDCF
ABDFCG
ABDFGC
ADBCF
GABCEFG
第一次这么快ak啊~~才8点20多。。。嗯,等考完再把代码放出吧~~
一开始没有看懂题目,看懂了就好办了。我是用暴力匹配,匹配上了标记为1,没有匹配上标记为0,补全9位(后面是补1)。
比如给的例子ABC,那么对于我来说就是
ABC 111111111
ABCD 111011111
ABDC 110111111
ABDCF 110101111
ABDFCG 110010111
ABDFGC 110001111
ADBCF 101101111
GABCEFG 011100011
所以其实就是暴力的去匹配resources,然后转成01串,排序输出就ok~
见代码~~
#include<bits/stdc++.h>
using namespace std;
struct node{
int a;
string b;
};
vector < string > res;
vector < node > v;
bool cmp( const node &v1, const node &v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致
{
return v1.b > v2.b;//升序排列
}
/*请完成下面这个函数,实现题目要求的功能*/
/*当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^ */
/******************************开始写代码******************************/
void doFilter(string a)
{
int length=a.length();
for(int i=0;i<res.size();i++)
{
int k=0;
string b=res[i];
int len=b.length();
string ans="";
int f=0;
for(int j=0;j<len;j++)
{
if(b[j]==a[k])
{
ans=ans+"1";
k++;
}
else
{
ans=ans+"0";
}
if(k==length)
{
f=1;
for(int t=j+1;t<len;t++)
{
ans=ans+"0";
}
break;
}
}
if(f==0)
{
continue;
}
int si=ans.length();
for(int j=si;j<=8;j++)
{
ans=ans+"1";
}
node tt;
tt.a=i;
tt.b=ans;
v.push_back(tt);
}
if(v.size()==0)
{
cout<<-1<<endl;
return;
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++)
{
int k=v[i].a;
cout<<res[k]<<endl; }
}
/******************************结束写代码******************************/
int main()
{
res.push_back("AB");
res.push_back("ABC");
res.push_back("ACB");
res.push_back("ABCD");
res.push_back("ADBCF");
res.push_back("ABDCF");
res.push_back("ABDC");
res.push_back("ABDFCG");
res.push_back("ABDFGC");
res.push_back("ABDEFG");
res.push_back("GABCEFG");
string a;
cin>>a;
doFilter(a);
return 0;
}