1. 程式人生 > >LeetCode 942 di-string-match 增減字串匹配

LeetCode 942 di-string-match 增減字串匹配

題目連結

LeetCode 周賽 111場B題

https://leetcode-cn.com/problems/di-string-match/

題意

        是有點難懂了,給出一個字串S,S全部由‘D’和‘I’組成,然後現在需要解出一個數組,而這個陣列需要和S相匹配。假設S的長度為N,那麼這個陣列的長度是N+1,並且值是集合{0...N}的任意排列。給出一個例子,假設有字串S1 = "DIDID",那麼S1的長度為5,那麼答案就必須是集合{0,1,2,3,4,5}的一個排序,可能是{5,4,3,2,1,0},也可能是{0,1,3,5,2,4}等等。

        而這個排序必須是與字串S相匹配的。這裡上題目的example:

“IDID”

[0,4,1,3,2]

題目的意思是,將字串與陣列一一對應,因為陣列多一位,不考慮這一位。剩下的位置,如果字串寫的是‘I’,那麼該位置上的數應該比右邊所有的數都小。而如果是‘D’,則是比右邊的都大。現在需要找到其中任意一組。

題解

        其實這個題是一個貪心,並且有點dp的感覺。感覺這個題是隻有唯一解的,如果哪位大佬可以證明歡迎評論。因為每一位對應的數字只有兩種情況:比右邊所有數都大,或者都小。那麼我們可以設定兩個值,初始的話:low = 0,high = N。這樣,從左開始遍歷字串,碰見一個字元,如果是‘I’,那麼就直接賦值low,同時low++。這樣,‘I’右邊所有的數,一定是都比這個位置大的。因為此時low>a[i],同時high > low。

        反而言之,碰見‘D’,直接賦值hight,同時high--。這樣所有的數就一定比這個小了。大概就是這樣,在O(n)的時間複雜度下就能構造出答案陣列。

Java 程式碼

class Solution {
    public int[] diStringMatch(String S) {
        int max = S.length();
        int len = S.length();
        int min = 0;
        int[] ans = new int[max+1];
        for(int i = 0;i < len;i++){
            char c = S.charAt(i);
            if(c == 'D'){
                ans[i] = max--;
            }else{
                ans[i] = min++;
            }
        }
        ans[len] = min;
        return ans;
    }
}