942. 增减字符串匹配

由范围 [0,n] 内所有整数组成的 n + 1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中:

  • 如果 perm[i] < perm[i + 1] ,那么 s[i] == 'I'
  • 如果 perm[i] > perm[i + 1] ,那么 s[i] == 'D'

给定一个字符串 s ,重构排列 perm 并返回它。如果有多个有效排列perm,则返回其中 任何一个

示例 1:

1
2
输入:s = "IDID"
输出:[0,4,1,3,2]

示例 2:

1
2
输入:s = "III"
输出:[0,1,2,3]

示例 3:

1
2
输入:s = "DDI"
输出:[3,2,0,1]

提示:

  • 1 <= s.length <= 105
  • s 只包含字符 "I""D"

题解:

贪心:每次选取最大或者最小值加入数组。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public int[] diStringMatch(String s) {

int len = s.length();
int low = 0;
int high = len;
//根据题意,数组长度比字符串长度多1
int[] perm = new int[len + 1];

for (int i = 0; i < len; i++) {
char c = s.charAt(i);
//如果是I,选取最小值加入数组
if (c == 'I') {
perm[i] = low++;
//如果是D,选取最大值加入数组
} else if (c == 'D') {
perm[i] = high--;
}
}
//最终两指针重合,将最后一个值填入数组
perm[len] = high;

return perm;


}
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)