最长公共子序列(JAVA实现)

举报
红目香薰 发表于 2022/01/22 00:54:28 2022/01/22
【摘要】  题目标题: 计算两个字符串的最长公共子序列的长度,字符不区分大小写。 输入描述:输入两个字符串,分两行输入。 输出描述:输出一个整数。 示例: 输入:  测试数据1(注,字符串前有空格): 12asdfa we2rasdaswer 输出:6 测试数据2: ABCADABBA...

 题目标题:


计算两个字符串的最长公共子序列的长度,字符不区分大小写。

输入描述:输入两个字符串,分两行输入。

输出描述:输出一个整数。

示例:

输入:

 测试数据1(注,字符串前有空格):


  
  1. 12asdfa
  2. we2rasdaswer

输出:6

测试数据2:


  
  1. ABCADAB
  2. BACDBA

输出:4

结果:

 LCS是Longest Common Subsequence的缩写,即最长公共子序列。一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列。

比如,对于char x[]="aabcd";有顺序且相互相邻的aabc是其子序列,有顺序但是不相邻的abc也是其公共子序列。即,只要得出序列中各个元素属于所给出的数列,就是子序列。再加上char y[]="12abcabcd";对比出才可以得出最长公共子序列abcd。


最长公共子序列动态规划解法:
dp[i][j] -- 表示子串A[0...i](数组长度为n)和子串B[0...j](数组长度为m)的最长公共子序列

当A[i] == B[j]时,dp[i][j] = dp[i-1][j-1] + 1;

否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1]);最优解为dp[n-1][m-1];


JAVA代码实现:


  
  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner scanner = new Scanner(System.in);
  5. while (scanner.hasNextLine()) {
  6. String str1 = scanner.nextLine().toLowerCase();
  7. String str2 = scanner.nextLine().toLowerCase();
  8. System.out.println(findLCS(str1, str1.length(), str2, str2.length()));
  9. }
  10. }
  11. public static int findLCS(String A, int n, String B, int m) {
  12. int[][] dp = new int[n + 1][m + 1];
  13. for (int i = 0; i <= n; i++) {
  14. for (int j = 0; j <= m; j++) {
  15. dp[i][j] = 0;
  16. }
  17. }
  18. for (int i = 1; i <= n; i++) {
  19. for (int j = 1; j <= m; j++) {
  20. if (A.charAt(i - 1) == B.charAt(j - 1)) {
  21. dp[i][j] = dp[i - 1][j - 1] + 1;
  22. } else {
  23. dp[i][j] = dp[i - 1][j] > dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1];
  24. }
  25. }
  26. }
  27. return dp[n][m];
  28. }
  29. }

 

文章来源: laoshifu.blog.csdn.net,作者:红目香薰,版权归原作者所有,如需转载,请联系作者。

原文链接:laoshifu.blog.csdn.net/article/details/117386998

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。