思路: 1 首先读取字典里的字符串到字符串数组中, 并排序;排序目的是减少查找时间
2: 按照输入的数字用DFS产生所有的字符串, 并判断是否在字典中;
#include<iostream>
#include<algorithm>
#include<string>
#include<fstream>
using namespace std;
string dict[5001];
string data="ABCDEFGHIJKLMNOPRSTUVWXYZ";
int flag=0, num;
ifstream fin("namenum.in");
ofstream fout("namenum.out");
void Init( )
{
int i, j, n;
ifstream fin1("dict.txt");
for(i=0; fin1>>dict[i]; i++);
sort(dict ,dict+i);
num=i;//记录字典里单词的个数
}
bool Search(string str)
{
int s, e, mid;
s=0, e=num-1;
while( s<=e )
{
mid=(s+e)/2;
if( str<dict[mid] ) e=mid-1;
else if( str>dict[mid]) s=mid+1;
else return 1;
}
return 0;
}
void DFS( string str, int i, string ans)
{
if( i>=str.length() )
{
if( Search(ans) )
{
flag=1;
fout<<ans<<endl;
}
return;
}
int j, k;
for(j=3*(str[i]-'2'), k=0; k<3; j++, k++)
{
ans.insert(i, 1, data[j]);
DFS(str, i+1, ans);
ans.erase(i);
}
}
int main()
{
string str, ans;
int i;
fin>>str;
Init( );
DFS(str, 0, ans);
if( !flag )
fout<<"NONE"<<endl;
}
改进一下, 在读取字典里的单词时, 先判断一下;如果和查找的串的长度相等, 放入dict[]中, 否则就不存储;
即将Init()函数稍微改一下;
void Init(int len)
{
int i, j=0;
ifstream fin1("dict.txt");
for(i=0; fin1>>temp; i++);
{
if( temp.length()==len )
{
dict[j]=temp;
j++;
}
}
sort(dict ,dict+j);
num=j;//记录字典里单词的个数
}
继续改进, 在读取单词时, 就将单词转化为对应的数串, 判断是否符合条件
另外: 用哈希……