1. 程式人生 > >[小米OJ] 6. 交叉隊列

[小米OJ] 6. 交叉隊列

起點 length sta () 數組 字母 urn stat clas

思路:

大概思想如下:
1. 動態規劃求解,構造dp[][] 二維數組;
2. 設dp[i][j], i 為 第一個字符串的第i個字母;j 為 第二個字符串的第j個字母
3. dp[i][j] 如果為 1 ,表示 s1[i] 等於 s3[i+j] 且 dp[i?1][j] 等於 1,同理s2
4. 簡單的說 dp[i][j] 為 1 就表示這個點可達,以 dp[0][0] 為起點, dp[len1][len2] 為終點,dp數組中值為 1 的點為路徑,向下走表示取 s1 的字符,向右走表示取 s2 的字符。這樣就將抽象的字符組合轉化成了更好理解的二維數組來表示;
5. 最優子結構即為: s1,s2 的 i,j 點字符之前的字符能否交叉組合成字符串 s3 的前 i+j 個字符,轉換到二維數組即為,i,j 點左側點和上方的點是否可達。

    private static String solution(String line) {
        String[] strs = line.split(",");
        int len0 = strs[0].length();
        int len1 = strs[1].length();
        int len2 = strs[2].length();
        if (len0 + len1 != len2)
            return false + "";

        int dp[][] = new int[len0 + 1][len1 + 1];
        
// init dp[0][0] = 1; for (int i = 1; i <= len0; i++) { if (strs[0].charAt(i - 1) == strs[2].charAt(i - 1)) dp[i][0] = dp[i - 1][0]; else break; } for (int i = 1; i <= len1; i++) { if (strs[1].charAt(i - 1) == strs[2].charAt(i - 1)) dp[
0][i] = dp[0][i - 1]; else break; } for (int i = 1; i <= len0; i++) { for (int j = 1; j <= len1; j++) { int k = i + j; if (strs[0].charAt(i - 1) == strs[2].charAt(k - 1) && dp[i - 1][j] == 1) dp[i][j] = 1; if (strs[1].charAt(j - 1) == strs[2].charAt(k - 1) && dp[i][j - 1] == 1) dp[i][j] = 1; } } if (dp[len0][len1] == 1) return true + ""; return false + ""; }

[小米OJ] 6. 交叉隊列