算法_00_KMP 的应用

来源:互联网 发布:java博客推荐 编辑:程序博客网 时间:2024/06/09 19:42

接着上一个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中的一个子树,不能是只包含一部分。
看到弹幕里有人问,如何确保这一点?我想了下,是因为序列化的时候,所有叶子节点下面没有子节点,为空,也要求必须用#表示。不能为空就不表示。
这里写图片描述