昨天做了leetcode里的 Longest Palindromic Substring ,一开始用动态规划O(N^2),不管怎么改都超时了。。。于是在大神的帮助下,找到了传说中的Manacher算法,居然能在O(n)内求出来,瞬间给跪了。
本屌认为,这个算法主要是充分的利用了以前的匹配的结果,来起到了降低时间复杂度的作用,这点跟KMP算是有点类似。在预处理时有个小技巧就是将第0,1为设...
分类:
其他好文 时间:
2014-06-20 12:15:22
阅读次数:
305
字符串匹配
精确:
indexOf(String str); -- strstr(), O(mn)。
lastIndexOf(String str); -- continue 的别样用法。
matches(String regex); -- Regex.compile()/match()。
模糊:
java package?
Spell Checker -- 两个字符串的相似程度...
分类:
编程语言 时间:
2014-06-20 11:00:18
阅读次数:
287
女神涉及的范围岂是吾们渣渣可以揣测到的?《基于连通性状态压缩的动态规划问题》 ——
插头dp《从《Cash》谈一类分治算法的应用》 —— cdq分治《弦图与区间图》等等等等。。Orz,渣渣还要更加努力。。
分类:
其他好文 时间:
2014-06-13 14:22:23
阅读次数:
192
组合数定义:从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中取出n个元素的一个组合;从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。
下面是一种比较通俗的计算公式:
其递归公式为:
c(n,m)=c(n-1,m-1)+c(n-1,m)
下面是c++实现该递归算法:
#include
#include
#d...
分类:
其他好文 时间:
2014-06-08 18:06:03
阅读次数:
672
题目:For example, given s = "aab",
Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut
解题思路:给一个字符串,如果字符串可以划分成若干子回文字符串,返回最小的划分数量。
这个题如果还用之前求所有划分组合的循环加递归方法的话,就会得到超时的错误。这是就要考虑别的方法,动态规划倒是一个不错的方法,但是动态规划最重要的是要找到动态方程。本题的动态方程:
dp[i] =...
分类:
其他好文 时间:
2014-06-08 14:56:58
阅读次数:
257
本题是思想挺难的题目,抽象思维要求挺高的。
使用动态规划法,首先要弄明白如何记录数据,并且明白记录的数据代表什么意义,否则是理解不了的。
这里也只是给出自己的理解,也许别人不一定能理解我为什么这样理解的。不过给出图,详细说明一下,希望我可以说清楚。
这里需要使用双重动态规划法了,首先定义第一个表tbl
这个表的数值,例如tbl[i][j]代表,从第一个点[1][1]到[i][j]点组成的(i-1) * (j-1)个方格,从点[1][1]出发想象发出射线到边界上所有点的总数。
如下图是i = 2, j =...
分类:
其他好文 时间:
2014-06-08 02:55:24
阅读次数:
560
最长回文字串,相信做过Palindrome Partitioning II 这个题的同学应该可以很快做出来。没错,这个题还可以使用动态规划方法得到一个时间复杂度为O(n^2)的解法,当然如果你想要更好的时间复杂度的算法也是有的。好的,我们先来看看时间复杂度为O(n^2)的算法。
代码实现--动态规划O(n^2)
相信如果你在网上看过了别人的算法,你会发现我的算法是最简洁的。哈哈,这个题需要注意的是如果你用惯了vector的话,你这里肯定会得到超时的提示...
...代码二--复杂度为O(n)的算法...
分类:
其他好文 时间:
2014-06-07 12:08:43
阅读次数:
224
题意:给n个白球,选其中一些涂为黑色,且给了涂第i个球的花费为ci,要求每m个连续的球中至少有两个黑球,问最小花费是多少?容易想到一个方程dp[i][j]=min{dp[k][i]}+c[j]dp[i][j]表示最后上色的两个球分别是第i和第j个球(i#include
#include #inclu...
分类:
其他好文 时间:
2014-06-05 12:52:14
阅读次数:
248
分治算法
一、基本概念
在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……
任何一个可以用计算机求解的...
分类:
其他好文 时间:
2014-06-04 14:10:55
阅读次数:
344
求最长合法匹配的长度,这道题可以用一维动态规划逆向求解。假设输入括号表达式为String s,维护一个长度为s.length的一维数组dp[],数组元素初始化为0。 dp[i]表示从s[i]到s[s.length - 1]包含s[i]的最长的有效匹配括号子串长度。则存在如下关系:...
分类:
其他好文 时间:
2014-06-04 13:52:03
阅读次数:
279