zoukankan      html  css  js  c++  java
  • pku2001

    额,比较简单的字典树,找出一个单词最短而且唯一的前缀,就是不会跟其他单词重复

    这样的话,插入只需在每一个单词经过的路径的节点p->v上累加,查找时,检查p->v的值,当p->==1时,即到此节点为止的前缀是最短而且是唯一的

    不知道大牛的0ms是怎么做出来的,,我用了16ms,膜拜啊

    #include<iostream>
    #include<string>
    using namespace std;
    struct node
    {
    	node *next[26];
    	int v;
    };
    node *root;
    char str[1001][21];
    void insert(char *s)
    {
    	node *p=root;
    	for(;*s!='\0';s++)
    	{
    		int d=*s-'a';
    		if(p->next[d]!=NULL)
    			p->v++;
    		else 
    			{
    				p->next[d]=new node();
    				p->v++;
    		}
    		p=p->next[d];
    	}
    	p->v++;
    }
    void find(char *s)
    {
    	node *p=root;
    	char *s1=s;
    	for(;*s1!='\0';s1++)
    	{
    		int d=*s1-'a';
    		p=p->next[d];
    		//cout<<p->v<<endl;
    		if(p->v==1)
    		{
    			*(++s1)='\0';
    			cout<<s<<endl;
    			return ;
    		}
    	}
    	cout<<s<<endl;
    }
    int main()
    {
    	int i=0;
    	root=new node();
    	while(scanf("%s",str[i])!=EOF)
    	{
    		insert(str[i]);
    		i++;
    	}
    	for(int j=0;j<i;j++)
    	{
    		cout<<str[j]<<' ';
    		find(str[j]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    接口
    java基础
    java的反射
    按照字典序打印所有的字符串
    求幂的问题
    时间复杂度与空间复杂度
    孩子们的游戏(圆圈中最后剩下的数)
    约瑟夫环问题
    翻转单词顺序列
    复杂链表的复制
  • 原文地址:https://www.cnblogs.com/nanke/p/2046887.html
Copyright © 2011-2022 走看看