我用动态规划,下面主要讲一下怎么去思考这个题。
在我的《通过金矿模型介绍动态规划》一文中我提到思考动态规划可以分为9个步骤,其实这9步中第一步是最重要的,就是如何模拟这个过程。
拿到这道题的时候,我们可以这样想,假如我有一张条纸,上面写了一个串s,我需要从前面开始剪掉一个前缀,但是每次剪下来的子串都必须是P集合中的元素,我需要知道剪掉的前缀最长可以有多长。
现在来思考问题的最后一步。如果最多可以剪掉长度为k的前缀,那么最后一步就是在s的k前缀中我需要从末尾剪掉哪一个子串,而这个字串必须是p中的元素。
那我到底剪掉p中的哪一个呢?我一个一个的试(选择),比如我选择p1,此时我的子问题就是这去掉了p1的k前缀能不能用p中的元素组合而得,可见出现了“子问题重叠”。
可见如果去掉了p1的k前缀能够用p中的元素组合而得,那么k前缀就能够用p中的元素组合而得,这叫“最优子结构”。
如果s的长度为length,p中有n个字串,那么就有length个前缀(问题数),对每个前缀有n种选择,算法的复杂度为O(length * n)
在我的《通过金矿模型介绍动态规划》一文中我提到思考动态规划可以分为9个步骤,其实这9步中第一步是最重要的,就是如何模拟这个过程。
拿到这道题的时候,我们可以这样想,假如我有一张条纸,上面写了一个串s,我需要从前面开始剪掉一个前缀,但是每次剪下来的子串都必须是P集合中的元素,我需要知道剪掉的前缀最长可以有多长。
现在来思考问题的最后一步。如果最多可以剪掉长度为k的前缀,那么最后一步就是在s的k前缀中我需要从末尾剪掉哪一个子串,而这个字串必须是p中的元素。
那我到底剪掉p中的哪一个呢?我一个一个的试(选择),比如我选择p1,此时我的子问题就是这去掉了p1的k前缀能不能用p中的元素组合而得,可见出现了“子问题重叠”。
可见如果去掉了p1的k前缀能够用p中的元素组合而得,那么k前缀就能够用p中的元素组合而得,这叫“最优子结构”。
如果s的长度为length,p中有n个字串,那么就有length个前缀(问题数),对每个前缀有n种选择,算法的复杂度为O(length * n)
Code