算法练习day13——190401(前缀树、贪心策略拼接字符串使字典序最小)

本文介绍了如何利用前缀树(Trie Tree)存储字符串,并详细解析了添加字符串和查询前缀的过程。接着,讨论了贪心策略在拼接字符串以获得最小字典序结果中的应用,通过分析比较策略的传递性证明了所用方法的正确性。
摘要由CSDN通过智能技术生成

1.前缀树(Trie Tree)

1.1 字符串生成前缀树的过程

字母是填在路上的,不是填在节点上的。

首先是一个空的头结点:

加入“abc”到这棵树中:

头结点有到a的路吗?没有,添加:

有a到b的路吗?没有,添加,c也一样:

接着添加字符串“bce”:

添加字符串“abd”:

添加字符串“bef”:

在添加N个字符串之后,可以查询,“某个字符串是否是以“be”开始的”。

若要查询“是否含有字符串“be”?”,原始的树结构,不足以实现这个功能。

  • 添加了“bef”,但是“be”的路径和“bef”的路径是重合的,无法判断有没有加过“be”。

需在节点处添加一个值,表示有多少个字符串是以这个字符结尾的。更改之后的树结构如下图:

此时b-e中e后面的节点值为0,说明没有加过"be"。

此树结构还可以查某个字符串加过几次。

“给出有多少个字符串以给定的额字符串作为前缀”——需要再加一个数据项:每一个节点被划过了多少次。

上述树结构,更改之后如下图所示:

添加字符串的代价:字符串本身的长度,和数据量N无关;

查某个字符的代价:字符串本身的长度,和数据量N无关;

1.2 代码实现

package Tree;

public class TrieTree {
	public static void main(String[] args) {
		Trie trie = new Trie();
		System.out.println(trie.search("hello"));
		trie.insert("hello");
		System.out.println(trie.search("hello"));
		trie.delete("hello");
		System.out.println(trie.search("hello"));
		trie.insert("hello");
		trie.insert("hello");
		trie.delete("hello");
		System.out.println(trie.search("hello"));
		trie.delete("hello");
		System.out.print
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值