动态规划

DP-2dimention

2016-08-05  本文已影响35人  Isabella10

97. Interleaving String

Given a list of unique words. Find all pairs of distinct indices(i, j)
in the given list, so that the concatenation of the two words, i.e.words[i] + words[j]
is a palindrome.
Example 1:Givenwords
=["bat", "tab", "cat"]
Return[[0, 1], [1, 0]]
The palindromes are["battab", "tabbat"]

Example 2:Givenwords
=["abcd", "dcba", "lls", "s", "sssll"]
Return[[0, 1], [1, 0], [3, 2], [2, 4]]
The palindromes are["dcbaabcd", "abcddcba", "slls", "llssssll"]


思考

思路

策略

  1. 回溯的思路【较为直观,实现繁琐,辅助变量较多】
  1. dp的思路【相对抽象,更加简洁,快】
if(  (str1[i-1]==str3[i+j-1] && map[i-1][j]==true)   ||
      (str2[j-1]==str3[i+j-1] && map[i][j-1]==true)   )
        map[i][j] = true;
// 正因为是交替出现,所以str1和str3匹配的时候,
// 要看前一个str2是不是和str3匹配。反之亦然。

实现

具体代码

    public boolean isInterleave(String s1, String s2, String s3) {
        if(s1==null || s2==null || s3==null)
            return false;
        if(s1.length() + s2.length() != s3.length())
            return false;
        
        int len1 = s1.length();
        int len2 = s2.length();
        boolean[][] map = new boolean[len1+1][len2+1];
        
        map[0][0] = true;
        
        char[] str1 = s1.toCharArray();
        char[] str2 = s2.toCharArray();
        char[] str3 = s3.toCharArray();
        
        for(int i=1; i<len1+1; i++)
        {
            if(str1[i-1]==str3[i-1] && map[i-1][0]==true )
                map[i][0] = true;
            else
                break;
        }
        
        for(int j=1; j<len2+1; j++)
        {
            if(str2[j-1]==str3[j-1] && map[0][j-1]==true)
                map[0][j] = true;
            else
                break;
        }
        
        for(int i=1; i<len1+1; i++)
        {
            for(int j=1; j<len2+1; j++)
            {
                if( (str1[i-1]==str3[i+j-1] && map[i-1][j]==true) ||
                    (str2[j-1]==str3[i+j-1] && map[i][j-1]==true) )
                    map[i][j] = true;
            }
        }
        return map[len1][len2];
    }

优化


小收获

  1. 多种可能性的路径探索,如果能够记忆化,就不一定要回溯
  2. 两个方向进行,可以抽象成矩阵的两个维度,或许会比用两个指针更方便。

To do list

  1. dp还有很多可以优化的地方,要继续总结。
  2. 尝试把以前做过的dp题都进行优化。

参考: http://blog.csdn.net/u011095253/article/details/9248073
http://www.cnblogs.com/boring09/p/4239255.html
http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/sunliymonkey/article/details/48165711

上一篇下一篇

猜你喜欢

热点阅读