A - 统计难题(字典树)

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

Input

输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

Output

对于每个提问,给出以该字符串为前缀的单词的数量.

Sample Input

banana

band

bee

absolute

acm

 

ba

b

band

abc

Sample Output

2

3

1

0

  • 题意概括  :

给你一些单词,然后再给你一些字符串,判断以该字符串为前缀的单词有几个。

  • 解题思路  :

首先把所给的单词,建立字典树,建立过程中他所出现的次数用一个变量储存起来,每个相同字符串出现一次,记录次数的变量就加一。

然后接下来就是查找了,每次查找到一个字母之后判断能不能继续往下走,如果能则继续往下走,如果不能返回0,最后直到整个串查找完返回最后一个字符所对应的前缀出现次数的值。

链表法:

空间时间复杂度较高。

#include
#include
#include

struct Trie
{
	int v;//记录相同前缀单词出现的次数
	Trie *next[26];
};

Trie root;

void get_trie(char *s)
{
	Trie *p = &root,*q;
	int i,j,c;
	int len = strlen(s);
	
	for(i = 0;inext[c] == NULL)
		{
			q = (Trie*)malloc(sizeof(root));//申请一个空间,同时将他强制转化为Trie型。
			q->v = 1;
			for(j = 0;j<26;j ++)
			q->next[j] = NULL;//每次将一个字母下边对应的字母的位置全部置为空
			p->next[c]=q;
			p = p->next[c];
		}
		else
		{
			p = p->next[c];
			p->v++;
		}
	}
}

int query(char *t)
{
	int len = strlen(t);
	int c,i,j;
	Trie *p = &root;
	
	for(i = 0;inext[c];//向下走,
		
		if(p == NULL)//如果向下走为空,返回0
		return 0;
	}
	return p->v;
}

int main()
{
	char word[11],i;
	
	
	for(i = 0;i<26;i ++)
	root.next[i] = NULL;//初始化根节点
	while(gets(word) != NULL)
	{
		int len = strlen(word);
		
		if(len == 0)
		break;
		
		get_trie(word);
	}
	
	while(gets(word) != NULL)
	{
		printf("%d\n",query(word));
	}
	
	return 0;
}

左儿子右兄弟:

时间空间复杂度都比较低。

#include
#include

const int MAX = 1000010;
const int MAXW = MAX*10 + 10;

struct Trie
{
	int v[MAXW];
	int next[MAXW];//类似于kmp算法中的next数组
	int head[MAXW];//相当于next数组转化的中间变量
	char ch[MAXW];
	int sz;
	
	void init()//初始化
	{
		sz = 1;
		v[0] = head[0] = next[0] = 0;
	}
	
	void insert(char *s)
	{
		int u = 0,len = strlen(s),c,i;
		int flag;
		
		for(i = 0;i

转移矩阵法:

空间复杂度较高,时间复杂度比链表法低。

#include
#include

int ch[1000010][26];
int v[1000010],sz = 1;

void get_trie(char *s)
{
	int c,i;
	int len = strlen(s),u = 0;
	
	for(i = 0;i

 

你可能感兴趣的:(A - 统计难题(字典树))