392. Is Subsequence

写得好的解题思路链接:url1 url2(动态规划写的比较好)

输入:两个字符串s和t,t可能会很长
输出:s是否是t的子序列。
规则:字符串子序列的定义是:通过删除字符串t的部分字符但是不能改变字符相对位置,能够得到字符串s,则s是t的一个子序列。
直观分析:就是挨个判断s中的字符串是否在t中出现。要求出现位置是递增的。

	public boolean isSubsequenceV3(String s, String t) {
        if(s==null || s.length()==0) return true;
        int m = s.length();
        int n = t.length();
        int index = 0;
        for(int i=0;i<n;i++){
            if(t.charAt(i) == s.charAt(index)){
                index++;
                if(index == m) {
                    return true;
                }
            }
        }
        return false;
    }

动态规划思路:先做暴力搜索。t需要删除部分字符成为s。当t[i]=s[i]的时候可以选择使用t[i]或者不使用t[i]。

 	public boolean isSubsequence(String s, String t) {
        this.s = s;
        this.t = t;
        return f(0,0);
    }
    private boolean f(int i,int j){
        if(i== s.length()){
            return true;
        }
        if(j == t.length()){
            return false;
        }
        if(s.charAt(i) == t.charAt(j)){
            if(f(i+1,j+1)) return true;
        }
        return f(i,j+1);
    }

设置数组dp[i][j],dp[i][j]=true表示子串s[0,i]是子串t[0,j]的一个子序列。

dp[i][j] = dp[i-1][j-1] 如果s[i]=t[j]。
dp[i][j] = dp[i][j-1] 如果s[i]!=t[j]。

	public boolean isSubsequenceV2(String s, String t) {
        if(s==null || s.length()==0) return true;
        if(t==null || t.length()==0) return false;
        boolean[][]  dp = new boolean[s.length()][t.length()];
        int m = s.length();
        int n = t.length();
        for(int j = 0;j < n;j++){
            if(s.charAt(0) == t.charAt(j)){
                dp[0][j] = true;
            }else{
                dp[0][j] = (j>0?dp[0][j-1]:false);
            }
        }
        for(int i=1;i<m;i++){
            for(int j=0;j<n;j++){
                if(s.charAt(i) == t.charAt(j)){
                    dp[i][j] = (j>0?dp[i-1][j-1]:false);
                }else{
                    dp[i][j] = j>0? dp[i][j-1] :false;
                }
            }
        }
        return dp[m-1][n-1];
    }

当然空间还可以进一步优化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值