LeetCode 392. 判断子序列 java题解

https://leetcode.cn/problems/is-subsequence/description/
转化为最长公共子序列问题。求[lens][j]的公共子序列长度是否为lens。

class Solution {
    //s属于t,lens<=lent
    public boolean isSubsequence(String s, String t) {
        int lens=s.length(),lent=t.length();
        if(s.length()==0) return true;
        if(lent<lens) return false;
        int[][] dp=new int[lens+1][lent+1];
        //[i][j]:前i个,[0,i-1]。求[lens][j]的公共子序列长度是否为lens
        //初始化:i为0或者j为0。公共子序列长度都为0
        //转化为最长公共子序列问题
        for(int i=1;i<=lens;i++){
            for(int j=1;j<=lent;j++){
                if(s.charAt(i-1)==t.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
                }
                if(i==lens&&dp[i][j]==lens){
                    return true;
                }
            }
        }
        return false;
    }
}

这道题应该算是编辑距离的入门题目,因为从题意中我们也可以发现,只需要计算删除的情况,不用考虑增加和替换的情况。
if (s[i - 1] == t[j - 1])
t中找到了一个字符在s中也出现了
if (s[i - 1] != t[j - 1])
相当于t要删除元素,继续匹配

本题 如果删元素一定是字符串t,而 1143.最长公共子序列 是两个字符串都可以删元素。

class Solution {
    public boolean isSubsequence(String s, String t) {
        int len1=s.length();
        int len2=t.length();
        int i=0,j=0;
        int count=0;//=len1
        while(i<len1&&j<len2){
            char c1=s.charAt(i);
            char c2=t.charAt(j);
            /*while(c1=c2&&i<len1&&j<len2){
                count++;

            }*/
            if(c1==c2){
                count++;
                i++;
                j++;
            }
            else{
                j++;
            }
        }
        return count==len1?true:false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值