POJ 2001 Shortest Prefixes(字典树入门)

题目:

http://poj.org/problem?id=2001

题意:

找到多个字符串中,各自唯一的最短子串,例如 carte 与 carce 各自唯一的最短子串为cart与carc,即不会与其它字符串的子串重复。

思路:

字典树

解题心得:

更新关键值的时机很重要

代码:

#include<stdio.h>
#include<string>
typedef struct Node
{
	char c;
	int count;
	struct Node* next[26]; 
}Node;
Node* CreateNode()
{
	Node* T=(Node*)malloc(sizeof(Node));
	int i;
	for(i=0;i<26;i++)
	{
		T->next[i]=NULL;
	}
	T->count=0;
	return T;
}
void insert(Node* T,char* str,int x)
{
	int len=strlen(str);
	//1.判断树根下是否存在st[i]
	int i;
	for(i=0;T->next[i]!=NULL;i++)
	{
		//存在,更新count,并继续往下搜索。
		if(T->next[i]->c==str[x])
		{
			T->next[i]->count++;
			x++;
			//字符串结束
			if(x==len)
			{
				return;
			}
			else
			{
				insert(T->next[i],str,x);
				return;
			}
		}
	}
	//2.不存在则建立节点
	if(T->next[i]==NULL)
	{
		Node* temp=CreateNode();
		temp->c=str[x];
		temp->count=1;
		T->next[i]=temp;
		x++;
		if(x==len) return;
		else
		{
			insert(T->next[i],str,x);
			return;
		}
	}
}
void print(Node* T,char* str,int x)
{
	//寻找T下,关键值为str[x]的节点
	int i;
	int len=strlen(str);
	for(i=0;T->next[i]!=NULL;i++)
	{
		if(T->next[i]->c==str[x])
		{
			if(T->next[i]->count==1)
			{
				printf("%c",T->next[i]->c);
				return;
			}
			else
			{
				printf("%c",T->next[i]->c);
				x++;
				if(x<len) 
				{
					print(T->next[i],str,x);
				}
				return;
			}
		}
	}
}
int main()
{
	char str[1001][30];
	Node* Tree=CreateNode();
	int i=0;
	while(gets(str[i]))
	{
		Tree->count++;
		insert(Tree,str[i],0);
		i++;
	}
	int j;
	for(j=0;j<i;j++)
	{
		printf("%s ",str[j]);
		print(Tree,str[j],0);
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值