题解 | #最长公共子序列(二)#

最长公共子序列(二)

https://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11

import java.util.*;


public class Solution {
    /**
     * longest common subsequence
     * @param s1 string字符串 the string
     * @param s2 string字符串 the string
     * @return string字符串
     */
    public String LCS (String s1, String s2) {
           int s1Len = s1.length();
        int s2Len = s2.length();

        if (s1Len <= 0 || s2Len <= 0) {
            return "-1";
        }
        int maxLen = 0;
        String maxString = "";
        int[][] dp = new int[s1Len][s2Len]; // mark the longest common string number
        char ch0 = s1.charAt(0);
          boolean is=false;
        for (int j0 = 0; j0 < s2Len; j0++) {
          
            if (ch0 == s2.charAt(j0)) {
                dp[0][j0] = 1;
                is=true;
            }else{
                if(is){
                    dp[0][j0] = 1;
                }
            }
        }
        char ch01 = s2.charAt(0);
        is=false;
        for (int i0 = 0; i0 < s1Len; i0++) {
           
            if (ch01 == s1.charAt(i0)) {
                dp[i0][0] = 1;
                is=true;
            }else{
                if(is){
                    dp[i0][0] = 1;
                }
            }
        }

        for (int i = 1; i < s1Len; i++) {
            for (int j = 1; j < s2Len; j++) {
                if (s1.charAt(i) == s2.charAt(j)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    maxLen = Math.max(dp[i][j], maxLen);
                    maxLen=Math.max(Math.max(dp[i - 1][j], dp[i][j - 1]),maxLen);
                }else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                    maxLen = Math.max(dp[i][j], maxLen);
                }

            }
        }
       
        int i2 = s1Len - 1;
        int j2Max = s2Len - 1;
        while (i2 >= 0 && maxLen >= 1) {
            for (int j2 = j2Max; j2 >= 0; j2--) {
                if (dp[i2][j2] == maxLen && s1.charAt(i2) == s2.charAt(j2)) {
                    maxString = s1.charAt(i2) + maxString;
                    maxLen--;
                    j2Max = j2;
                    break;
                }
            }
            i2--;
        }
        if(maxString.equals("")){
            return "-1";
        }
        return maxString;
    }
}

全部评论

相关推荐

11-27 12:36
已编辑
门头沟学院 前端工程师
Apries:这个阶段来说,很厉害很厉害了,不过写的简历确实不是很行,优势删掉吧,其他的还行
点赞 评论 收藏
分享
冷艳的小师弟在看机会:jd测评乱点直接被挂了,哭死~
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-26 15:46
已编辑
字节国际 电商后端 24k-35k
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务