LeetCode:Interleaving String

来源:互联网 发布:社交网络的优缺点 编辑:程序博客网 时间:2024/05/01 15:30

跟最大公共子序列思路一样,动态规划解决。

我使用了Map保存动态规划结果。


package leetcode;import java.util.HashMap;import java.util.Map;public class InterleavingString {public static void main(String[] args) {InterleavingString s = new InterleavingString();boolean b = s.isInterleave("ab", "ab", "bbaa");System.out.println(b);}private String s1;private String s2;private String s3;private Map<String, Boolean> result = new HashMap<String, Boolean>();public boolean isInterleave(String s1, String s2, String s3) {if (s1 == null) {s1 = "";}if (s2 == null) {s2 = "";}if (s3 == null) {s3 = "";}        if (s1.length() + s2.length() != s3.length()) {        return false;        }        this.s1 = s1;        this.s2 = s2;        this.s3 = s3;        result.clear();                return isInterleave(s1.length(), s2.length());    }private boolean isInterleave(int len1, int len2) {if (len1 == 0) {return this.s2.substring(0, len2).equals(this.s3.substring(0, len2));}if (len2 == 0) {return this.s1.substring(0, len1).equals(this.s3.substring(0, len1));}String key = buildKey(len1, len2);Boolean value = result.get(key);if (value != null) {return value.booleanValue();} else {boolean r;char c1 = this.s1.charAt(len1 - 1);char c2 = this.s2.charAt(len2 - 1);char c3 = this.s3.charAt(len1 + len2 - 1);boolean r1 = false;if (c1 == c3) {r1 = isInterleave(len1 - 1, len2); }if (r1) {r = true;} else {if (c2 == c3) {r1 = isInterleave(len1, len2 - 1);if (r1) {r = true;} else {r = false;}} else {r = false;}}result.put(key, r);return r;}}private String buildKey(int len1, int len2) {StringBuffer sb = new StringBuffer();sb.append(len1);sb.append('-');sb.append(len2);return sb.toString();}}


原创粉丝点击