97. 交错字符串 字符串动态规划

97. 交错字符串

难度:困难
2020/7/18每日一题打卡√
现在开始觉得字符串动态规划都是一个套路,但是要定义好状态。我这道题没想出来状态,但是看了答案之后很快就写出来后面的了
题目描述
在这里插入图片描述
解题思路

首先定义状态,dp[i][j]表示s1的第i位能不能和s2的第j位组合成s3的第i+j位
这个图,感觉和那种从上到下动态规划找路径的好像啊
在这里插入图片描述
初始化[0,0]位置肯定是true,然后初始化第一行和第一列
对于后面的位置,他要么是从上面转化来,要么是从左边转化来
如果是从上面来,dp[i][j] = dp[i-1][j] && (s1.charAt(i-1) == s3.charAt(i-1+j));
这句意思是,首先要上面那个位置是true,然后比较s1对应位置的字母跟s2对应位置上的是否相等。
也可以是从左边转化而来,从左边的话是:
dp[i][j] = dp[i][j-1] && (s2.charAt(j-1) == s3.charAt(i+j-1));
如果左边是true,而且s2对应位置的字母和s3对应的相等,就可以
最后这两个位置结果取或,因为不管从哪边来都行

/*
		    * 97. 交错字符串
		    * 难度:困难  动态规划
		    * dp[i][j]表示s1的第i位能不能和s2的第j位组合成s3的第i+j位
		    */
		    public boolean isInterleave(String s1, String s2, String s3) {
		    	int len1 = s1.length();
		    	int len2 = s2.length();
		    	int len3 = s3.length();
		    	if(len1+len2 != len3) {
		    		return false;
		    	}
		    	boolean[][] dp = new boolean[len1+1][len2+1];
		    	dp[0][0] = true;
		    	//初始化第一列,只有s1的情况
		    	for (int i = 1; i <= len1; i++) {
					dp[i][0] = dp[i-1][0] && (s1.charAt(i-1)==s3.charAt(i-1));
				}
		    	//初始化第一行,只有s2的情况
		    	for (int i = 1; i <= len2; i++) {
					dp[0][i] = dp[0][i-1] && (s2.charAt(i-1)==s3.charAt(i-1));
				}
		    	for (int i = 1; i <= len1; i++) {
					for (int j = 1; j <= len2; j++) {
						dp[i][j] = dp[i-1][j] && (s1.charAt(i-1) == s3.charAt(i-1+j));
						dp[i][j] = dp[i][j] || dp[i][j-1] && (s2.charAt(j-1) == s3.charAt(i+j-1));
					}
				}
		    	return dp[len1][len2];

		    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值