求两个字符串的最大公共子串
来源:互联网 发布:淘宝怎么申请试用 编辑:程序博客网 时间:2024/06/02 11:12
求连个字符串的最大公共子串有很多种方法,本文将尝试用穷举的方法得到两个字符串的最大公共子串。
基本思想是:根据字符串长度从大到小,依次找出某一字符串的子串,找到的子串和另一个字符串做匹配。如果匹配成功,当前子串就是两个字符串的最大公共子串。例如:字符串”abcdef” ,按长度从大到小,其子串分别为
“abcdef”
“abcde” “bcdef”
“abcd” “bcde” “cdef”
“abc” “bcd” “cde” “def”
“ab” “bc” “cd” “de” “ef”
“a” “b” “c” “d” “e” “f”
用到的库函数有:
strlen() //求字符串的长度
strcpy() //字符串拷贝
strstr() //查找串sStr 在串lStr 中首次出现的位置,返回指向该位置的指针,找不到匹配则返回空指针
#include <stdio.h>#include <string.h>#define MAXSIZE 100int isMatch(char *sStr,char *lStr);void getLcs(char *sStr,char *lStr);//全局变量存放最大公共子串char longestCommonSubstr[MAXSIZE];int main(){ char *s=longestCommonSubstr; char *s1="abcdefgh"; char *s2="acefg"; getLcs(s2,s1); printf("%s\n",s); return 0;}//参数中字符串顺序不会影响函数实现,//建议把短字符串放前面,提高性能void getLcs(char *sStr,char *lStr){ int len=(int)strlen(sStr); //母串长度 int i; //子串长度 int j; //子串个数 i+j==len+1 int k; //子串首字符在母串中下标 int m; //计数器 for(i=len;i>0;i--) { for(j=1;j<=len-i+1;j++) { for(k=0;k<j;k++) { char str[MAXSIZE]; for(m=0;m<i;m++) { str[m]=sStr[k+m]; } str[i]=0; //得到子串 if(isMatch(str,lStr)) { strcpy(longestCommonSubstr,str); return; } } } } char failGet[]="没有公共子串"; strcpy(longestCommonSubstr,failGet); return;}int isMatch(char *sStr,char *lStr){ //查找串sStr 在串lStr 中首次出现的位置,返回指向该位置的指针 //找不到匹配则返回空指针 char *p = strstr(lStr,sStr); if(p == NULL) return 0; return 1;}
使用说明:
函数getLcs() 两个参数顺序不会影响函数实现,但是为了提高性能,建议把短字符串放前面。
当有多个最大公共子串时,只能输出前面(从左到右顺序)第一个子串。后续可改进为全部输出。
* 本程序不适用于多个字符串求最大公共子串,以下情况时,程序会失效:
* char *s1="abcdefgh";
* char *s2="abcefg";
* char *s3="ef";
* getLps(s1,s2);
* getLps(s, s3);
0 0
- LCS求两个字符串的最大公共子串
- 求两个字符串的最大公共子串
- 求两个字符串的最大公共子串
- 求两个字符串的最大公共子串
- C++实现求两个字符串的最大公共子串
- 求两个字符串的最大公共子串
- 两个字符串的最大公共子串
- 两个字符串的最大公共子串
- 求两个字符串的公共子串
- java实现字符串匹配问题之求两个字符串的最大公共子串
- 求两个字符串的公共最大子字符串,如asdfsdkgf,kllsdkabc的最大子串为sdk
- 求两个字符串的最大子串
- 两个字符串的最大公共子字符串
- 两个字符串的最大公共子字符串
- 求两个字符串的最大公共子串 ,不区分大小写
- 动态规划算法求两个字符串的最大公共子串
- 求两个字符串的最大公共子串【培训第三天】
- 面试题之求两个字符串的最大公共子串
- HDU - 4939 Stupid Tower Defense
- InnoDB与Myisam的六大区别总结
- Optimal Milking
- poj 1195 二维树状数组 及二维树状数组模板
- 经典C++ part1
- 求两个字符串的最大公共子串
- word下面画流程图技巧
- ACdream 1056并查集+map
- Uncompressing Linux... done, booting the kernel
- STL string常用函数
- 女子与13岁儿子发生性关系
- Meta标签使用详解
- ibatis Could not find SQL statement to include with refid 'xxx' 问题
- Java学习之道:使用JAXP进行DOM解析( DocumentBuilderFactory、DocumentBuilder、Document)