搜索技术(LCS算法研究)

LCS(longest common substring)算法,即最大公共子串,它是求两个字符串最长公共子串的问题。大体解法是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置. 例如,有两个字符串: A= I MISS MY CODE HI B= One Like MY Code 这里,先忽略掉大小写,通吃,在C#或者PHP中,String.ToLower()或者lower()可以考虑.对于其中的特殊字符,例如空格,可以在比较的时候直接删除.另外,该算法比较与顺序无关,可以随意的翻转字符串.接下来比较.

 

imissmycodehi
o0000000010000
n0000000000000
e0000000000100
l0000000000000
i1010000000001
k0000000000000
e0000000000100
m0100010000000
y0000001000000
c0000000100000
o0000000010000
d0000000001000
e0000000000100

 

在上面的矩阵图中,其中的红色就可以看成匹配的字符串. 以下C#代码:

//Run By LCS.

public string GetSameString (string ArgA,string ArgB){
 if(String.IsNullOrEmpty(ArgA) || String.IsNullOrEmpty(ArgB)) return String.Empty;
 int[] CompareArr=new int[ArgB.Length];
 int max=0,maxJ=0;
 for(int iloop=0;iloop<ArgA.Length;iloop++){
  for(int jloop=ArgB.Length-1;jloop>=0;jloop--){
   CompareArr[jloop]=(ArgB[jloop]==ArgA[iloop])?( (iloop==0||jloop==0)?1:CompareArr[jloop-1]+1):0;
   if(CompareArr[jloop]>=max){
    max=CompareArr[jloop];
    maxJ=jloop;
   }
  }
 }
 if(max>0){
  return ArgB.Substring(maxJ-max+1,max);
 }else return String.Empty;
}

 

 注释:如果翻转后(可不翻转)相同,当前数组Index=N的值是N-1的值 + 1,这样,当最长的那条线上的就是最大的数字,同时,记录索引号.这样: Max 就是最多的匹配数, maxJ就是B字符串的索引. 亦可以这样理解: 竖的是A字符串,横的是B字符串,为了能在数组中记录上次的比较值,对单行进行倒循环,如果取值相同,该值是左上角的值加一,就是最长的字符串个数,即Max,同时记录当前的B字符串最后相同的索引值.然后用Substring()函数截取即可.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值