【描述问题】
一个9宫格键盘,图示
连续输入根据经验产生提示
【思想】
这个有个问题就是经验权值,有要根据不同输入模糊匹配。需要通过Hash 类似方式存放,然后就是权值排列问题。
比较输入4-3-3-5-6 可能同时表示其他单词。
【时空】
空间:O(n) 链表实现
时间:O() 这个根据平均查找长度不同
【代码】
代码部分有:
(1) 实现动态构建树 查找
(2)查找当前输入匹配的所有单词指针头
- /** Code For Keenbo @ 2012*/
- void createTree(struct node* head,char* str,int weight)
{
/*find the target node*/
int index;
struct node * p;
p=head;
index=0;
while(str[index++]!='\0')
{
int next;
switch(str[index])
{
case 'a':case 'b':case 'c':next=0;break;
case 'd':case 'e':case 'f':next=1;break;
case 'g':case 'h':case 'i':next=2;break;
case 'j':case 'k':case 'l':next=3;break;
case 'm':case 'n':case 'o':next=4;break;
case 'p':case 'q':case 'r':case 's':next=5;break;
case 't':case 'u':case 'v':next=6;break;
case 'w':case 'x':case 'y':case 'z':next=7;break;
default:next=8;break;
}
if(p->next[next]!=NULL)
p=p->next[next];
else {
struct node * newnode=new node();
newnode->words=NULL;
p->next[next]=newnode;
p=newnode;
}
}
/*insert the node*/
struct word * wp=p->words;
while(wp!=NULL)
{
if(wp->weight<=weight)
break;
wp=wp->next;
}
struct word * newword=new word();
newword->next=NULL;
newword->value=str;
newword->weight=weight;
if(wp!=NULL)
{
newword->next=wp;
wp=newword;
return ;
}
wp=newword;
}
void findWords(struct node* head,char* keys,struct word* words)
{
int index;
struct node* p;
index=0;
p=head;
while(keys[index++]!='0'&&p!=NULL)
{
int i=(int)keys[index]-(int)'0';
p=p->next[i];
}
if(p==NULL)
{
words=NULL;
return;
}
words=p->words;
}