题目描述
给定只由 'I' (上升)和 'D' (下降)组成的字符串 s。
设 n = s.size(),需要构造一个 0 ~ n 的整数排列,满足:
-
s[i] == 'I'→ans[i] < ans[i+1] -
s[i] == 'D'→ans[i] > ans[i+1]
返回任意一个合法排列即可。
解题思路(贪心核心)
这道题是非常经典的贪心模板题。
定义两个指针:
-
left = 0:当前可用最小值
-
right = n:当前可用最大值
贪心策略:
-
遇到 'I'(需要上升) :放当前最小值 left,小数用完,后面自然可以变大
-
遇到 'D'(需要下降) :放当前最大值 right,大数用完,后面自然可以变小
字符串遍历结束后,left == right,剩下最后一个数直接放入答案。
cpp
class Solution {
public:
vector<int> diStringMatch(string s) {
int n=s.size();
vector<int>ret;
int left=0,right=n;
for(auto e:s)
{
if(e=='I')
ret.push_back(left++);
else
ret.push_back(right--);
}
ret.push_back(right);
return ret;
}
};