942. 增减字符串匹配
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/di-string-match
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length。
返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i = 0, ..., N-1,都有:
如果 S[i] == "I",那么 A[i] < A[i+1]
如果 S[i] == "D",那么 A[i] > A[i+1]
示例 1:
输入:"IDID"
输出:[0,4,1,3,2]
示例 2:
输入:"III"
输出:[0,1,2,3]
示例 3:
输入:"DDI"
输出:[3,2,0,1]
提示:
- 1 <= S.length <= 10000
- S 只包含字符 "I" 或 "D"。
题目分析
- 根据题目描述根据字符串s生成0-s.length的数组
- left=0,right=s.length,标识出剩余的数字构成的范围
- 遍历字符串s,当遇到‘I’则把left填入数组,并且left++;否则把right填入数组,并且right--。知道遍历完成,此时left和right相等,再把left填入数组
代码
class Solution {
public:
vector<int> diStringMatch(string s) {
int left = 0;
int right = s.length();
std::vector<int> greedy;
for (char c : s) {
if (c == 'I') { greedy.emplace_back(left++); }
else { greedy.emplace_back(right--); }
}
greedy.emplace_back(left);
return greedy;
}
};