接下来就是递推式了。如果知道res[i][j]之前的全部历史信息,我们怎么得到res[i][j]。能够看出,事实上仅仅有两种方式来递推,一种是选取s1的字符作为s3新加进来的字符。还有一种是选s2的字符作为新进字符。而要看看能不能选取,就是推断s1(s2)的第i(j)个字符是否与s3的i+j个字符相等。如果能够选取而且相应的res[i-1][j](res[i][j-1])也为真。就说明s3的i+j个字符能够被表示。这两种情况仅仅要有一种成立,就说明res[i][j]为真。是一个或的关系。
所以递推式能够表示成
public boolean isInterleave(String s1, String s2, String s3) {
    if(s1.length()+s2.length()!=s3.length())
        return false;
    String minWord = s1.length()>s2.length()?s2:s1;
    String maxWord = s1.length()>s2.length()?s1:s2;
    boolean[] res = new boolean[minWord.length()+1];
    res[0] = true;
    for(int i=0;i<minWord.length();i++)
    {
        res[i+1] = res[i] && minWord.charAt(i)==s3.charAt(i);
    }
    for(int i=0;i<maxWord.length();i++)
    {
        res[0] = res[0] && maxWord.charAt(i)==s3.charAt(i);
        for(int j=0;j<minWord.length();j++)
        {
            res[j+1] = res[j+1]&&maxWord.charAt(i)==s3.charAt(i+j+1) || res[j]&&minWord.charAt(j)==s3.charAt(i+j+1);
        }
    }
    return res[minWord.length()];
}
动态规划事实上还是有套路的,无非就是找到维护量,然后得到递推式。接下来看看历史信息对于空间的需求。尽量优化。会在后面对于动态规划做一个比較通用的总结哈。Interleaving String -- LeetCode
原文:http://www.cnblogs.com/mengfanrong/p/5184377.html