最长公共子串(Longest Common SubStrings)

Description

给出两个字符串,求出两个字符串的公共子串?


sample Input

encodingmy
mydecoding


sample Output

coding


两种方法:

//暴力求解最长公共子串
    public static void enumString(char[]s1 ,char[]s2){
        int run_Count = 0;//运行次数
        int common_length = 0;//长度
        String largest_str = "";
        for(int i=0;i<s1.length;i++){
            for(int j=0;j<s2.length;j++){
                int length = 0;
                int m = i;
                int n = j;
                String tem_str = "";//临时子串
                while(m<s1.length && n < s2.length){
                    run_Count ++;
                    if(s1[m] != s2[n]) break;
                    tem_str = tem_str + s1[m];
                    length++;
                    m++;
                    n++;
                }
                if(common_length < length){
                    common_length = length;
                }
                if(tem_str.length()>=largest_str.length()){
                    largest_str = tem_str;
                }
            }
        }
        System.out.println("最长公共子串数:"+common_length);
        System.out.println("最长公共子串:"+largest_str);
        System.out.println("运行次数:"+run_Count);
    }
//动态规划方法
    public static void dpString(char[]s1 ,char[]s2){
        int[][] dp = new int[101][101];
        int max = -1;
        //初始化数组
        for(int i=0;i<dp.length;i++){
            dp[0][i] = 1;
            dp[i][0] = 1;
        }
        int x = 0;
        int y = 0;
        for(int i=1;i<s1.length;i++){
            for(int j=1;j<s2.length;j++){
                if(s1[i] == s2[j]){
                    //动态转移方程
                    dp[i][j] = dp[i-1][j-1] + 1;
                }else{
                    dp[i][j] = 0;
                }
                if(max < dp[i][j]){
                    max = dp[i][j];
                    x = i;
                    y = j;
                }
            }
        }
        //输出子串
        System.out.print("最长子串:");
        for(int i=0,k=max;k>0;k--,i++){
            System.out.print(s1[x-max+1+i]);
        }
        //输出子串长度
        System.out.println("\n最长子串长度:"+max);
    }
import java.util.Scanner;

public class Main { 
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        //字符串数据读取
        String str1 = in.nextLine();
        String str2 = in.nextLine();
//      str1 = str1.replace(" ", "");
//      str2 = str2.replace(" ", "");
//      System.out.println(str1);  
//      System.out.println(str2);
        char[]s1 = str1.toCharArray();
        char[]s2 = str2.toCharArray();
//      enumString(s1,s2);
        dpString(s1,s2);
    }

结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值