for-一个程序谁给讲解下?

问题描述

一个程序谁给讲解下?

char * suff[100];

int pstrcmp(const void p, const void *q)
{
return strcmp(
(char**)p,*(char**)q);
}

int comlen_suff(char * p, char * q)
{
int len = 0;
while(*p && *q && *p++ == *q++)
{
++len;
if(*p == '#' || *q == '#')
{
return len;
}
}
return 0;
}

void LCS_suffix(char * X, int xlen, char * Y, int ylen)
{
int suf_index = maxlen = maxindex = 0;

int len_suff = xlen + ylen + 1;
char * arr = new char [len_suff + 1];  /* 将X和Y连接到一起 */
strcpy(arr,X);
arr[xlen] = '#';
strcpy(arr + xlen + 1, Y);

for(int i = 0; i < len_suff; ++i)  /* 初始化后缀数组 */
{
    suff[i] = & arr[i];
}

qsort(suff, len_suff, sizeof(char *), pstrcmp);

for(int i = 0; i < len_suff-1; ++i)
{
    int len = comlen_suff(suff[i],suff[i+1]);
    if(len > maxlen)
    {
        maxlen = len;
        suf_index = i;
    }
}
outputLCS(suff[suf_index]);

}

解决方案

后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。

子串:字符串S的子串r[i..j],i<=j,表示r串中从i到j这一段,也就是顺次排列r[i],r[i+1],...,r[j]形成的字符串。

后缀:后缀是指从某个位置i开始到整个串末尾结束的一个特殊子串。字符串 s 的从第i个字符开始的后缀表示为Suffix(i), 也就是Suffix(i)=r[i..len(s)]。

大小比较:关于字符串的大小比较,是指通常所说的“字典顺序”比较,也就是对于两个字符串u、v,令i 从1 开始顺次比较u[i]和v[i],如果u[i]=v[i]则令i加1,否则若u[i]v[i]则认为u>v(也就是vlen(u)或者i>len(v)仍比较不出结果,那么,若len(u)len(v)则u>v。
从字符串的大小比较的定义来看,S的两个开头位置不同的后缀u和v进行比较的结果不可能是相等,因为u=v的必要条件len(u)=len(v)在这里不可能满足。

后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列SA[1],SA[2],……,SA[n],并且保证Suffix(SA[i])<Suffix(SA[i+1]),1<=i<n。也就是将S的n个后缀从小到大进行排序之后把排好序的后缀的开头位置顺次放入SA中。

1 后缀数组求最长公共子串(LCS)

解决方案二:

http://www.cnblogs.com/luxiaoxun/archive/2012/10/05/2712131.html

时间: 2025-01-20 18:22:54

for-一个程序谁给讲解下?的相关文章

代码-有没有人帮我讲解下jsp的程序呢?实在是看不懂,网上搜索也了解了点

问题描述 有没有人帮我讲解下jsp的程序呢?实在是看不懂,网上搜索也了解了点 希望你们帮我讲讲整个代码的框架?怎么实现的,实在是看不懂,网上搜索也了解了点 解决方案 建议先看servlet,然后再了解jsp 解决方案二: JSP实际上就是是一个servlet程序,只是jsp把这个servlet封装起来,通过PrintWriter的方式,将你的jsp中的内容,以html的元素内容形式返回给页面 解决方案三: 通俗的讲,jsp就是服务端servlet运行代码的一种视图表现形式,你也可以理解为网页,只

求大神给我详细讲解下面的c++贪吃蛇程序

问题描述 求大神给我详细讲解下面的c++贪吃蛇程序 #include #include #include #include using namespace std; // 刷新当前屏幕 inline void Refresh(char q[][22], int grade, int gamespeed){ ????system("cls");?????//??清屏 ?int i,j; ?cout << endl; ?for(i=0;i ?????cout ??for(j=0

linux shell,将数据流重定向作为下一个程序的输入,由于有缓冲机制,数据流无法实时进行处理

问题描述 linux shell,将数据流重定向作为下一个程序的输入,由于有缓冲机制,数据流无法实时进行处理 上述问题可以简化为以下问题: python脚本如下: #coding=utf-8 import sys import os import time if __name__ == '__main__': while True: print time.strftime('%Y-%m-%d %H:%M:%S') time.sleep( 5 ) 然后通过linux命令行:python produ

用Winform开发了一个程序,界面上的控件在Win7下是基本对齐的,到了WindowsServer2008下就变的完全对不齐了?请问这是什么原因?

问题描述 用Winform开发了一个程序,界面上的控件在Win7下是基本对齐的,到了WindowsServer2008下就变的完全对不齐了?请问这是什么原因?RT 解决方案 解决方案二:不知道你是用什么方法"对齐"的,所以无法判断.比如说你用"空格"来搞什么"对齐",那么不同系统的同一个主题下的细节设置也是有调整的,空格在高版本的windows下肯定就变宽了一些,那么自然在高版本windows下就"鼓出去"了.你用于"

forname()-关于同一个包下,一个程序可以找到类,另一个却可以找到类

问题描述 关于同一个包下,一个程序可以找到类,另一个却可以找到类 如图,forName()找不到Employee类,以为环境变量怎么了,再次在同一包下新建了Tempest来检测,可以TempTest却可以找到,求大神解惑 解决方案 C币可以干嘛? 原帖2L 解决方案二: 找不到类!查看你的类是否确定有

javascript-编写的一个HTML和JavaScripte程序,麻烦看下哪里出了错误

问题描述 编写的一个HTML和JavaScripte程序,麻烦看下哪里出了错误 解决方案 onclick="verfy(document.getElementsByName('a')[0].value)" 解决方案二: onclick="verfy(a.value)" 这行代码不对,你的a是前面那个input的name属性所以a.value是找不到对应的值得,你应该id="a" 然后document.getElementById("a&

resultmap-MyBatis怎么在程序不变的情况下,把两个字段映射到一个字段中。

问题描述 MyBatis怎么在程序不变的情况下,把两个字段映射到一个字段中. 比如有firstName和lastName两个字段,怎么将两个字段映射到一个字段中,在resultMap中怎么实现.或者还有什么其它方式,急急急 解决方案 说清楚是你的对象这边是两个字段还是数据库那里是两个字段. 解决方案二: select firstName||lastName as name from xxx; resultMap里用name跟实体里面的属性对应 解决方案三: 没必要,你可以加上一个get Stri

加密-编写 一个程序vxworks下的简单程序

问题描述 编写 一个程序vxworks下的简单程序 编写 一个程序vxworks下的简单程序,可以与加密狗关联,在没有加密狗的情况下,系统无法启动. 解决方案 编写一个简单的C++程序编写一个简单的servlet小程序Vim 编写一个简单程序

[求救] JBuilder9.0环境下 编辑一个程序 实现 输出我的电脑上建立的FTP服务器目录下所有文件名

问题描述 就是先在本地开启了FTP服务在C:inetpubftproot文件夹里随便建立了几个文件,假设文件名是1,2,3,4现在用JAVA在JBuilder9下写一个程序输出结果是我的电脑上的这个FTP站点下的这个文件夹下所有文件的文件名,也就是输出:1,2,3,4我是小白,这对我来说很难,请高手大大指点,最好给个代码让我学习一下,谢谢了,很急的说. 解决方案 解决方案二:没有大虾在吗?