当前位置:  编程技术>c/c++/嵌入式

最长公共子字符串的使用分析

    来源: 互联网  发布时间:2014-10-15

    本文导语:  子字符串的定义和子串的定义类似,但要求是连续分布在其他字符串中。比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2。最长公共子字符串共有两种解决方法,下面具体说说我的思路方法一:Lon...

子字符串的定义和子串的定义类似,但要求是连续分布在其他字符串中。比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2。
最长公共子字符串共有两种解决方法,下面具体说说我的思路
方法一:
Longest Common Substring和Longest Common Subsequence是有区别的
X =
Y =
X和Y的Longest Common Sequence为,长度为4
X和Y的Longest Common Substring为 长度为2
其实Substring问题是Subsequence问题的特殊情况,也是要找两个递增的下标序列
和 使
xi1 == yj1
xi2 == yj2
......
xik == yjk
与Subsequence问题不同的是,Substring问题不光要求下标序列是递增的,还要求每次
递增的增量为1, 即两个下标序列为:

类比Subquence问题的动态规划解法,Substring也可以用动态规划解决,令
c[i][j]表示Xi和Yi的最大Substring的长度,比如
X =
Y =
c[1][1] = 1
c[2][2] = 2
c[3][3] = 0
c[4][4] = 1
动态转移方程为:
如果xi == yj, 则 c[i][j] = c[i-1][j-1]+1
如果xi ! = yj,  那么c[i][j] = 0
最后求Longest Common Substring的长度等于
max{  c[i][j],  1 max ? curmax : max;
    curmax = 0;
   }
  }
  max = curmax > max ? curmax : max;
 }
 return max;
}
int main(void)
{
 char str1[1000],str2[1000];
 printf("请输入第一个字符串:");
 gets(str1);
 printf("请输入第二个字符串:");
 gets(str2);
 int len = longest_common_substring(str1, str2);
 printf("最长公共连续子串的长度为:%dn",len);
 system("pause");
 return 0;
}

效果图如下:

稍微改动一下,便可以输出公共子串了,就是要保存一下连续公共子串最后一个字符在其中一个字符串中的下标位置:
代码如下:

/**
找出两个字符串的最长公共连续子串的长度
** author :liuzhiwei 
** data   :2011-08-16
**/
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int longest_common_substring(char *str1, char *str2)
{
 int i,k,len1,len2,len,s1_start,s2_start,idx,curmax,max;
 len1 = strlen(str1);
 len2 = strlen(str2);
 len = len1 + len2;
 max = 0;
 for(i = 0 ; i < len ; i++)
 {
  s1_start = s2_start = 0;
  if(i < len1)
   s1_start = len1 - i;    //每次开始匹配的起始位置
  else
   s2_start = i - len1;
  curmax = 0;
  for(idx = 0 ; ( s1_start + idx < len1 ) && ( s2_start + idx < len2 ); idx++ )
  {
   if(str1[s1_start+idx]==str2[s2_start+idx])
    curmax++;
   else     //只要有一个不相等,就说明相等的公共字符断了,不连续了,要保存curmax与max中的最大值,并将curmax重置为0
   {
    //max = curmax > max ? curmax : max;
    if(curmax > max)
    {
     max = curmax;
     k = s1_start+idx-1;      //保存连续子串长度增加时连续子串最后一个字符在str1字符串中的下标位置,便于输出公共连续子串
    }
    curmax = 0;
   }
  }
  //max = curmax > max ? curmax : max;
  if(curmax > max)
  {
   max = curmax;
   k = s1_start+idx-1;
  }
 }
 //输出公共子串
 char s[1000];
 for(i=0;i

    
 
 

您可能感兴趣的文章:

  • C++ Strings(字符串) 成员 size():返回字符串中字符的数量
  • 关于字符串的操作,我想得到字符串的长度,和他开始两位组成的新的字符串,例如::
  • C++ Strings(字符串) 成员 c_str():将字符串以C字符数组的形式返回
  • C语言实现输入一个字符串后打印出该字符串中字符的所有排列
  • C++ Strings(字符串) 成员 find():在字符串中查找字符
  • 如何使GDB显示完整的字符串变量,当字符串比较长时。
  • C++ Strings(字符串) 成员 end():返回一个迭代器,指向字符串的末尾。(最后一个字符的下一个位置)
  • php判断字符串在另一个字符串位置的方法
  • C++ Strings(字符串) 成员 empty():如果字符串为空,返回真
  • 请教,有关16进制字符串形成2进制字符串的问题!
  • C++ Strings(字符串) 成员 length():返回字符串的长度
  • 如何将一个双引号”放在一个字符串中,就是在字符串中如何转义一个双引号。谢谢!
  • C++ Strings(字符串) 成员 resize():重新设置字符串的大小
  • shell程序:在大文件中查找特定字符串,但该字符串可以跨行
  • C++ Strings(字符串) 成员 Operators:操作符,用于字符串比较和赋值
  • 怎样判断一个字符串在另一个字符串里面?
  • C++ Strings(字符串) 成员 reserve():保留一定容量以容纳字符串(设置capacity值)
  • 请问怎样从键盘读入一个字符串,怎样连接两个字符串,谢谢
  • C++ Strings(字符串) 成员 swap():交换两个字符串的内容
  • 浅析string类字符串和C风格字符串之间的区别
  • C++ Strings(字符串) 成员 rbegin():返回一个逆向迭代器,指向最后一个字符
  • 如何用shell实现将指定文件中的指定的字符串替换为我指定的另外的字符串
  • Python不使用print而直接输出二进制字符串
  • 在ACC变成中要使用发ftp传送文件,但文件名不确定,请问怎么样在程序的FTP中使用字符串变量???
  • php使用strip_tags从字符串中去除html标记
  • 怎样在使用curses字符串输出函数或字符输出函数时,隐藏光标
  • 如何用sha1sum获取一个字符串使用sha-1加密后的16进制字符串?
  • 使用java如何分析系统不能识别的字符串?
  • 关于使用shell在文件中查找一段字符串的问题
  • 使用shell在文本文件中进行字符串搜索问题?shell高手请进,分不够可以再加
  • 使用sh脚本如何替换指定目录下所有文件中的指定字符串
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Strings(字符串) 成员 insert():插入字符
  • 有个小问题,如何将一字符串按一定规则分割成字符串数组?
  • Linux c字符串中不可打印字符转换成16进制
  • 在JAVA中如何实现在一个长字符串查找某个字符串??
  • C++ Strings(字符串) 成员 find_first_of():查找第一个与value中的某值相等的字符
  • 在SQL中获取一个长字符串中某个字符串出现次数的实现方法
  • C++ Strings(字符串) 成员 find_last_of():查找最后一个与value中的某值相等的字符
  • 去除字符串中的相同的字符串的sql函数
  • C++ Strings(字符串) 成员 get_allocator():返回配置器
  • 从字符串中 查找匹配字符串
  • C++ Bitsets 成员 to_string():返回bitset的字符串表示
  • C语言中的字符串拼接问题,怎么得不到我想要的字符串?
  • C++ Strings(字符串) 成员 erase():删除字符
  • sql函数实现去除字符串中的相同的字符串
  • C++ Strings(字符串) 成员 rfind():查找最后一个与value相等的字符(逆向查找)
  • 在java/jsp里怎样判断一个yyyymmdd格式的字符串是合法的日期型字符串,并求两日期字符串之间的天数?
  • C++ Strings(字符串) 成员 find_first_not_of():查找第一个与value中的所有值都不相等的字符
  • 想用"|"来分离字符串,但用String.split("|")总是出现错误,总是多分离出一个空串,如果字符串中有空格那错误更多。
  • C++ Strings(字符串) 成员 find_last_not_of():查找最后一个与value中的所有值都不相等的字符
  • PHP替换字符串(只替换首个字符串)
  • C++ Strings(字符串) 成员 rend():返回一个逆向迭代器,指向第一个元素的前一个位置
  • 在linux下写一个shell:if(字符串1==“”(空) 或字符串2====“”(空))怎马写啊,急


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    怎样在使用curses字符串输出函数或字符输出函数时,隐藏光标 iis7站长之家