POJ1458 - Common Subsequence (Java)

 题目描述

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.

烤乐滋每次见到小姐姐都十分紧张,为了减缓这种紧张感,他决定尽可能找到自己与小姐姐的共同点。这天,烤乐滋凭借自己强大的人格魅力获取了小姐姐的基因片段,同时他也提供了自己的基因片段,现在我们假定,他们的公共点个数为两个片段的最长公共子序列中元素个数,请你来帮帮他吧!

Input

The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

多组输入,每行有两个字符串,基因片段长度不超过500

Output

For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.

每行一个答案,表示每组数据中他们的公共点个数

Sample

Input

abcfbc         abfcab
programming    contest 
abcd           mnp

Output

4
2
0

Java代码

经典dp,子序列并非子串,可以不用连续。本来这题我是写了输入输出流,但是一直RE,不知道是不是平台的问题,交了无数次令人奔溃,以下是AC代码。
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (true){
            String a = in.next();
            String b = in.next();
            char[] aa = a.toCharArray();
            char[] bb = b.toCharArray();
            int n1 = a.length();
            int n2 = b.length();
            int[][] dp = new int[n1+1][n2+1];//记录a串第i个字符匹配到b串第j个字符的最长公共子串长度
            for (int i = 1; i <= n1; i++) {
                for (int j = 1; j <= n2; j++) {
                    if (aa[i-1] == bb[j-1]) {
                        dp[i][j] = dp[i-1][j-1] +1;
                    }else {
                        dp[i][j] = Math.max(Math.max(dp[i-1][j], dp[i][j-1]),dp[i-1][j-1]);
                    }
                }
            }
            System.out.println(dp[n1][n2]);
        }
    }

}

题目链接

Common Subsequence - POJ 1458 - Virtual Judge (vjudge.net)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值