本串最长重复子串&最长公共子串

 本串最长重复子串

思路:将S中以每两个字符为开头的子串进行比较。

Void Get_LRepSub(StringType S)
{
       MaxLen = 0; Index1 = 0; Index2 = 0;
       For(i=1;i<=S.length;i++){ //此处,i为两字符的距离
        For(k=0,j=1;j<=S.length-i;j++){
       If(S[j] == S[j+i]) k++;
       Else k = 0;
       If(k > MaxLen){
              MaxLen = k; Index1 = j; Index2 = j+i;
       }
}
}
} //如要求重复子串不重叠,则在内层For循环中添加条件k<=i

时间复杂度为 O(S.length ^ 2)

 

最长公共子串

思路:借助本串最长重复子串的思路,将两字符串开做一个字符串,查找其本串最长重复子串,如果两重复的子串分别在原来的两个字符串中,则查找成功。

Void Get_LPubSub(StringType S, StringType T)
{
       If(S.length > T.length)
              A = S; B = T;
       Else
              A = T; B = S; //A和B形如|B|A|
       MaxLen = 0; Index1 = 0; Index2 = 0;
       For(i=1;i<=A.length+B.length;i++){
       //j的取值必然在B的长度范围内,即j<B.length;j+i的取值必然在A的范围内,即j+i>B.length,即j>B.length-i
       For(k=0,j=B.length-i+1;j<B.length;j++){ 
       If(B[j] == A[j+i-B.length]) k++;
       Else k = 0;
       If(k > MaxLen){
       MaxLen = k; Index1 = j; Index2 = j+i-B.length;
}     
}
}
}

时间复杂度为O(S.length*T.length)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值