领扣LintCode问题答案-29. 交叉字符串

领扣LintCode问题答案-29. 交叉字符串

目录

  • 29. 交叉字符串
  • 鸣谢

29. 交叉字符串

给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。

样例 1:

输入:
“aabcc”
“dbbca”
“aadbbcbcac”
输出:
true

样例 2:

输入:
“”
“”
“1”
输出:
false

样例 3:

输入:
“aabcc”
“dbbca”
“aadbbbaccc”
输出:
false

public class Solution {
     
	/**
	 * @param s1: A string
	 * @param s2: A string
	 * @param s3: A string
	 * @return: Determine whether s3 is formed by interleaving of s1 and s2
	 */
	public boolean isInterleave(String s1, String s2, String s3) {
     
		// write your code here
		int len1 = s1.length();
		int len2 = s2.length();
		int len3 = s3.length();

		if (len1 + len2 != len3) {
     
			return false;
		}

		char[] cs1 = s1.toCharArray();
		char[] cs2 = s2.toCharArray();
		char[] cs3 = s3.toCharArray();

		boolean[][] dp = new boolean[len1 + 1][len2 + 1];
		dp[0][0] = true;

		for (int i = 1; i <= len1; i++) {
     
			dp[i][0] = dp[i - 1][0] && (cs1[i - 1] == cs3[i - 1]);
		}
		for (int i = 1; i <= len2; i++) {
     
			dp[0][i] = dp[0][i - 1] && (cs2[i - 1] == cs3[i - 1]);
		}
		for (int i1 = 1; i1 <= len1; i1++) {
     
			for (int i2 = 1; i2 <= len2; i2++) {
     
				dp[i1][i2] = (dp[i1 - 1][i2] && cs1[i1 - 1] == cs3[i1 + i2 - 1])
						|| (dp[i1][i2 - 1] && cs2[i2 - 1] == cs3[i1 + i2 - 1]);
			}
		}

		return dp[len1][len2];
	}
}

原题链接点这里

鸣谢

非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

你可能感兴趣的:(算法,算法)