算法入门经典的最长前缀匹配公共前缀 是否有错

| 漏洞检测 |
| 隐藏捆绑 |
最长回文子串算法
#1032 : 最长回文子串时间限制:1000ms单点时限:1000ms内存限制:64MB描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提
时间限制:1000ms
单点时限:1000ms
内存限制:64MB
小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。
这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的呢?”
小Ho奇怪的问道:“什么叫做最长回文子串呢?”
小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往前读一模一样的字符串,所以最长回文子串的意思就是这个字符串中最长的身为回文串的子串啦~”
小Ho道:“原来如此!那么我该怎么得到这些字符串呢?我又应该怎么告诉你我所计算出的最长回文子串呢?
小Hi笑着说道:“这个很容易啦,你只需要写一个程序,先从标准输入读取一个整数N(N
最后附上代码以供分析:
#define N 1000010
class Solution {
char buf[N];
void solve() {
scanf("%d", &kase);
while (kase--) {
scanf("%s", &buf);
int longestLength = longestPalindrome(buf);
printf("%d\n", longestLength);
int longestPalindrome(char buf[]) {
int n = strlen(buf);
int j = 0, i,
// in case the length of palindrome is odd
int result = 1;
for (i = 1; i < i++) {
f[i] = min(f[2*j-i] + 2*i, f[j]+2*j) - 2*i;
if (f[i] = 0, right
f[j] + 2*j) j =
result = max(result, f[i]);
// in case the length of palindrome is even
f[0] = 0; j = 0;
for (i = 0; i < n-1; i++) {
f[i] = min(f[2*j-i], f[j]-2*i+2*j);
if (f[i] = 0 , right
f[j] + 2*j) j =
result = max(result, f[i]);
int main() {
solution.solve();
(责任编辑:幽灵学院)
------分隔线----------------------------
闭包中的循环强引用 解决闭包和类实例之间的循环强引用可以通过定义捕获列表来实现。 ...
1.table有4种基本操作:读,写,迭代和获取长度。 lua中没有删除操作而是将对应键位的...
控件基本情况 控件本身 CMainFrame View 将所有的控件消息全部转发给CMainFrame来处理...
之前在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,...
异常: 异常概述: 异常时程序运行时代码序列中产生的一种异常情况。这里采用的名词是...
多字段(Multivalue Fields) 在多字段上使用短语匹配会产生古怪的行为: PUT /my_index...
admin@1744.cc
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院
广告服务:QQ:| 漏洞检测 |
| 隐藏捆绑 |
后缀数组之最长公共前缀
#include #define maxn 100 int main() { int rank[maxn],height[maxn],sa[maxn]= {0,3,1,4,2},s[maxn]= {1,2,3,2,3};//s串可以看成abcbc int i,j,k=0; for(i=0; i
#define maxn 100
int main()
int rank[maxn],height[maxn],sa[maxn]= {0,3,1,4,2},s[maxn]= {1,2,3,2,3};//s串可以看成abcbc
int i,j,k=0;
for(i=0; i
(责任编辑:幽灵学院)
------分隔线----------------------------
闭包中的循环强引用 解决闭包和类实例之间的循环强引用可以通过定义捕获列表来实现。 ...
1.table有4种基本操作:读,写,迭代和获取长度。 lua中没有删除操作而是将对应键位的...
控件基本情况 控件本身 CMainFrame View 将所有的控件消息全部转发给CMainFrame来处理...
之前在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,...
异常: 异常概述: 异常时程序运行时代码序列中产生的一种异常情况。这里采用的名词是...
多字段(Multivalue Fields) 在多字段上使用短语匹配会产生古怪的行为: PUT /my_index...
admin@1744.cc
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院
广告服务:QQ:kmp_Ext 运用扩展KMP算法求出某一字符串与另 的所有最长公共前缀 Mathimatics-Numerical algorithms 数值 /人工智能 182万源代码下载-
&文件名称: kmp_Ext
& & & & &&]
&&所属分类:
&&开发工具: Delphi
&&文件大小: 1 KB
&&上传时间:
&&下载次数: 3
&&提 供 者:
&详细说明:运用扩展KMP算法求出某一字符串与另一字符串的所有最长公共前缀-KMP algorithm the extended use of a string with another string of all longest common prefix
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&kmp_Ext.txt
&输入关键字,在本站182万海量源码库中尽情搜索:今天在看代码源文件求diff的原理的时候看到了LCS算法。这个算法应该不陌生,动规的经典算法。具体算法做啥了我就不说了,不知道的可以直接看《算法导论》动态规划那一章。既然看到了就想回忆下,当想到算法正确性的时候,发现这个算法的正确性证明并不好做。于是想了一段时间,里面有几个细节很trick,容易陷进去。想了几轮,现在把证明贴出来,有异议的可以留言一起交流。
先把一些符号和约定说明下:
假设有两个数组,A和B。A[i]为A的第i个元素,A(i)为由A的第一个元素到第i个元素所组成的前缀。m(i, j)为A(i)和B(j)的最长公共子序列长度。
由于算法本身的递推性质,其实只要证明,对于某个i和j:
& m(i, j) = m(i-1, j-1) + 1 (当A[i] = B[j]时)
& m(i, j) = max( m(i-1, j), m(i, j-1) )&(当A[i] != B[j]时)
第一个式子很好证明,即当A[i] = B[j]时。可以用反证,假设m(i, j) & m(i-1, j-1) + 1 (m(i, j)不可能小于m(i-1, j-1) + 1,原因很明显),那么可以推出m(i-1, j-1)不是最长的这一矛盾结果。
第二个有些trick。当A[i] != B[j]时,还是反证,假设m(i, j) & max( m(i-1, j),&m(i, j-1) )。
由反证假设,可得m(i, j) & m(i-1, j)。这个可以推出A[i]一定在m(i, j)对应的LCS序列中(反证可得)。而由于A[i] != B[j],故B[j]一定不在m(i, j)对应的LCS序列中。所以可推出m(i, j) = m(i, j-1)。这就推出了与反正假设矛盾的结果。
阅读(...) 评论()

我要回帖

更多关于 最长公共子序列算法 的文章

 

随机推荐