LeetCode 942 di-string-match 增減字串匹配
阿新 • • 發佈:2018-11-24
題目連結
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; } }