#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <vector>
#include <list>
#include <math.h>
#include <algorithm>
using namespace std;
int main()
{
char dic[1001][21], subStr[21],tmp[21];
int i, j, p, k;
memset( dic , 0 , sizeof(char)*1001*21 );
memset( subStr , 0 , sizeof(char)*21 );
memset( tmp , 0 , sizeof(char)*21 );
k = 0 ;
while( EOF != scanf("%s",dic[k]) ) k++;
for( i = 0 ; i < k ; i++ )
{
for( j = 1 ; j <= strlen(dic[i]) ; j++ )
{
strncpy( subStr , dic[i] , j );
for( p = 0 ; p < k ; p++ )
{
if( p != i )
{
strncpy ( tmp , dic[p] , j );
if( strcmp(tmp,subStr) == 0 ) break ;
}
}
if( p < k )continue;
if( p == k )break;
}
printf("%s %s\n",dic[i],subStr);
memset( subStr , 0 , sizeof(char)*21 );
memset( tmp , 0 , sizeof(char)*21 );
}
return 1;
}
用暴力解决的,时间复杂度为1000*20*1000,可以考虑用前缀树(字典树)
暴力思路:
对于每个字符串,分别取其长度为 j ( 1 <= j <= strlen )的前缀,判断该前缀在其他字符串中是否出现,如果没有出现,那么就是该字符串的最短前缀;
当j 等于该字符串的长度时,可以不用与别的字符串判断,直接输出就可以了。