这个题目考察的是数据库设计的基本思路。原题目的大意是设计一个数据过滤器,能找到匹配给定前缀和后缀的下标。
最开始写了个无脑的判断前缀和后缀的方法,如下
class WordFilter {
public:
WordFilter(vector<string> words) {
for(int i=0;i<words.size();i++)
{
// cout<<"w:"<<words[i]<<endl;
w.emplace_back(words[i]);
}
ws =words.size();
}
int f(string p, string s) {
// cout<<"p:"<<p<<"s:"<<s<<endl;
for(int i=ws-1;i>=0;i--)
{
if(isp(w[i],p) && iss(w[i],s))
{
return i;
}
}
return -1;
}
private:
bool isp(string d,string p)
{
int ds =d.size();
int ps =p.size();
if(ds < ps)
return false;
for(int i=0;i<p.size();i++)
{
if(p[i] != d[i])
return false;
}
return true;
}
bool iss(string d,string s)
{
int ss =s.size();
int ds =d.size();
if(ds < ss)
return false;
for(int i=ss-1;i>=0;i--)
{
if(s[i] != d[i+ds-ss])
return false;
}
return true;
}
int ws;
vector<string> w;
};
果然TLE了,哈哈,用map存储words就可以搞定了,代码如下:
class WordFilter {
public:
WordFilter(vector<string> words) {
for(int i=0;i<words.size();i++)
{
string w =words[i];
int ws =w.size();
for(int lp=0;lp<=ws;lp++)
{
string dp=w.substr(0,lp);
for(int ls=0;ls<=ws;ls++)
{
string ds=w.substr(ws-ls,ls);
db[dp+"#"+ds]=i+1;
}
}
}
}
int f(string prefix, string suffix) {
string d(prefix+"#"+suffix);
if(db[d] > 0)
return db[d]-1;
return -1;
}
private:
unordered_map<string,int> db;
};
需要注意的是substr和unordered_map的使用,就ok了。