【动规入门】

1.最长公共子序列和最长公共连续子序列(子串)

以"hellowrold","loop"为例

1.1非连续(子序列)

这个状态转移方程要好好领悟
dp[i+1][j+1] = Math.max(dp[i][j+1],dp[i+1][j]);

在这里插入图片描述

2.连续(子串)

在这里插入图片描述

package leetcodego.dp;

import java.util.Scanner;

public class LCS {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        int x = sc.nextInt();
        //连续子序列
        if(x==1){
            for(int i=0;i<s1.length();i++){
                for(int j=0,k=s1.length()-i;j<s2.length()&&k<s2.length();j++,k++){
                    String str = s1.substring(j,k+1);
                    if(s2.contains(str)){
                        System.out.println(str.length());
                        return;
                    }
                }
            }

        }
        //非连续子序列dp
        if(x==2){
            //dp[i+1][j+1]截止到s1的第i个,s2的第j个,最长公共子序列
            int[][] dp = new int[s1.length()+1][s2.length()+1];
            for(int i=0;i<s1.length();i++){
                for(int j=0;j<s2.length();j++){
                    if(s1.charAt(i)==s2.charAt(j))
                        dp[i+1][j+1]=dp[i][j]+1;
                    else dp[i+1][j+1] = Math.max(dp[i][j+1],dp[i+1][j]);
                }
            }
            System.out.println(dp[s1.length()][s2.length()]);
        }

        //连续子序列dp
        if(x==3){
            //dp[i+1][j+1]:以s1的第i个,s2的第j个结尾的最长公共子序列
            int[][] dp = new int[s1.length()+1][s2.length()+1];
            int max=0;
            for(int i=0;i<s1.length();i++){
                for(int j=0;j<s2.length();j++){
                    if(s1.charAt(i)==s2.charAt(j)){
                        dp[i+1][j+1]=dp[i][j]+1;
                        max = Math.max(max,dp[i+1][j+1]);
                    }
                    else dp[i+1][j+1] = 0;
                }
            }
            System.out.println(max);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值