从一组字符串中查找所有以某个字符串开头的字符串
noho 2001-10-08 10:03:34 1、 问题描述
你的任务是设计一种数据结构以及相应的算法,给定一个字符串A,利用该数据结构,从给定的一组字符串中找出以字符串A开头的所有字符串。
2、 输入
输入的第一个参数是一个字符串A,A的长度是N,1≤N≤5000。
输入的第二个参数是一个整数M,表示给定的一组字符串中字符串的数目,1≤N≤5000。
输入的第三个参数是一组字符串,每个字符串的长度从1到5000不等。
3、 输出
输出的第一个参数是一个整数K,表示匹配的字符串的数目。
输出的第二个参数是一组匹配的字符串。
4、 输入输出样例
输入:”abc”, 5, “aaa”, “abc”, “abcd”, “abcdefg”, “acd”
输出:3, “abc”, “abcd”, “abcdefd”
我自己设计了一个数据结构,但是效率不是很高,请教各位大虾,有没有更好的方法?
#pragma warning(push, 3)
#include<map>
#include<vector>
using namespace std;
#pragma warning(pop)
template<class T>
class CTree
{
typedef map<short, void *> ContainerType;
typedef vector<T *> NodeArray;
public:
CTree()
{
}
virtual ~CTree()
{
Clear();
}
void Clear()
{
unsigned int nSize=0;
ContainerType::iterator it;
for(it=m_map.begin(); it!=m_map.end(); it++)
{
if((*it).first==0)
{
NodeArray * parr=(NodeArray *)(*it).second;
NodeArray & arr=*parr;
nSize=arr.size();
for(unsigned int i=0; i<nSize; i++)
{
T * pNode=arr[i];
delete pNode;
}
arr.clear();
delete parr;
}
else
{
CTree * pTree=(CTree *)(*it).second;
pTree->Clear();
delete pTree;
}
}
m_map.clear();
}
void AddNode(LPCTSTR lpszName, T * pT)
{
short nIndex=(short)*lpszName;
ContainerType::iterator it;
it=m_map.find(nIndex);
if(nIndex==0)
{
if(it==m_map.end())
{
NodeArray * parr=new NodeArray;
parr->push_back(pT);
m_map[0]=parr;
}
else
{
NodeArray * parr=(NodeArray *)(*it).second;
parr->push_back(pT);
}
}
else
{
LPTSTR szTemp=::CharNext(lpszName);
if(it==m_map.end())
{
CTree * pTree=new CTree;
pTree->AddNode(szTemp, pT);
m_map[nIndex]=pTree;
}
else
{
CTree * pTree=(CTree *)(*it).second;
pTree->AddNode(szTemp, pT);
}
}
}
void GetNodes(LPCTSTR lpszName, vector<T *> & vec)
{
short nIndex=*lpszName;
ContainerType::iterator it;
it=m_map.find(nIndex);
unsigned int nSize=0;
if(nIndex==0)
{
if(it!=m_map.end())
{
NodeArray & arr=*((NodeArray *)(*it).second);
nSize=arr.size();
for(unsigned int i=0; i< nSize; i++)
vec.push_back(arr[i]);
}
ContainerType::iterator it2;
for(it2=m_map.begin(); it2!=m_map.end(); it2++)
{
if((*it2).first==0)
continue;
CTree * pTree=(CTree *)(*it2).second;
pTree->CollectNode(vec);
}
}
else
{
if(it==m_map.end())
{
return;
}
else
{
LPTSTR szTemp=::CharNext(lpszName);
CTree * pTree=(CTree *)(*it).second;
pTree->GetNodes(szTemp, vec);
}
}
}
void CollectNode(vector<T *> & vec)
{
ContainerType::iterator it;
unsigned int nSize=0;
for(it=m_map.begin(); it!=m_map.end(); it++)
{
if((*it).first==0)
{
NodeArray & arr=*((NodeArray *)(*it).second);
nSize=arr.size();
for(unsigned int i=0; i< nSize; i++)
vec.push_back(arr[i]);
}
else
{
CTree * pTree=(CTree *)(*it).second;
pTree->CollectNode(vec);
}
}
}
protected:
// if TCHAR = 0 void * = vector<T *>
// else void * = CTree *
map<short, void *> m_map;
};