有序字符串搜索
內存限制: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;
}