第4章练习题--7--最短前缀--2797

来源:互联网 发布:锁机软件生成器软件 编辑:程序博客网 时间:2024/06/03 14:47
#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 等于该字符串的长度时,可以不用与别的字符串判断,直接输出就可以了。

原创粉丝点击