该题和POJ2503一样,采用字典树。思维大同小异。
直接附上源码。
<pre name="code" class="java">#include <stdio.h>
#include <stdlib.h>
typedef struct trie{
int count;
struct trie* next[26];
}trie;
trie* root;
char output[21];
char input[1000][21] ;
trie* createNode(){
trie* p = (trie*)malloc(sizeof(trie));
memset(p,0,sizeof(trie));
return p;
}
void insert(char* str){
trie* p =root;
while(*str){
int pos = *str-'a';
if(p->next[pos]==NULL){
p->next[pos]=createNode();
}
p=p->next[pos];
p->count++;
str++;
}
}
void find(char* str){
int pos =*str -'a';
trie* p =root;
int i=0;
for(i=0;str[i]!='\0';i++){
pos =str[i]-'a';
if(p->count == 1){ //到达非公共前缀的最后一个字符
break;
}
p=p->next[pos];
output[i]=str[i];
}
}
int main()
{
root=createNode();
int len=0;
// freopen("input.txt","r",stdin);
memset(output,0,sizeof(output));
memset(input,0,sizeof(input));
while(scanf("%s,",input[len])!=EOF){
insert(input[len]);
len++;
}
int i=0;
for(i=0;input[i][0]!='\0';i++){
find(input[i]);
printf("%s %s\n",input[i],output);
memset(output,0,sizeof(output));
}
return 0;
}
在这里声明了一个二维数组:char input[1000][21] 用于存放输入的字符串。
在第二部分,进行查询字符串时,for循环条件用的是input[i][0]!=‘\0’,而不是input[i]!='\0' , 因为是二维数组,此时input[i] 是存放一连串的 ‘\0’。