算法_00_KMP 的应用

接着上一个blog,记录下可以用 KMP 来解的题目

问题1

给定一个字符串str1,只能往str1的后面添加字符变成str2。 要求1:str2必须包含两个str1,两个str1可以有重合,但是不 能以同一个位置开头。
要求2:str2尽量短
最终返回str2

思路:
- 找出包含 str1最后一个字符的最大前缀后缀匹配字符串的长度endNext
- 在 str1后面添加 endNext位置开始的 str1子串,得到 str2
这里写图片描述
问题2:

给定两个二叉树T1和T2,返回T1的某个子树结构是否与T2的结构相等。

思路:
1. 把T1和 T2分别都序列化,序列化的时候可以采用:1代表有值,#代表为空,特殊符号分隔开两个节点。我们采用先序遍历,例如:1_1##_1#_#,可以准确还原下面这颗二叉树(==这图)
1
/ \
1 1
/ \ / \
null null null null
2. 然后该题目就可以转化为判断 str1中是否包含str2字符串来解答。

突然想起来,T1包含 T2的结构,要求 T2是 T1中的一个子树,不能是只包含一部分。
看到有人问,如何确保这一点?我想了下,是因为序列化的时候,所有叶子节点下面没有子节点,为空,也要求必须用#表示。不能为空就不表示。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值