地址:
力扣https://leetcode-cn.com/problems/di-string-match/
题目:
由范围 [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:
输入:s = "IDID" 输出:[0,4,1,3,2] |
示例 2:
输入:s = "III" 输出:[0,1,2,3] |
示例 3:
输入:s = "DDI" 输出:[3,2,0,1] |
提示:
1 <= s.length <= 105 s 只包含字符 "I" 或 "D" |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/di-string-match
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
给定的字符串,每个字符是两个数字构成
那么还原的整形数组长度是字符串长度 + 1
观察字符串,如果N = 字符串长度:
s[0] == 'I',那么 perm[0] = 0(最小值) 一定满足 perm[0] < perm[1]
剩下的字母构建的数字区间 [1,2....N]
s[0] == 'D',那么 perm[0] =N(最大值) 一定满足 perm[0] > perm[1]
剩下的字母构建的数字区间 [N-1, N-2....1]
第一个元素的值确定,后续元素也是第一个元素同样的逻辑,只是区间要变
所以推演出来就是:
每次取出数字区间里的 最大值(遇见 D) 或 最小值(遇见 I)
因为数的长度固定,最终 最大值 = 最小值
方法一、给定最大、最小值
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* diStringMatch(char * s, int* returnSize){
int slen = strlen(s);
int plen = slen + 1;
int *perm = (int *)malloc(sizeof(int) * plen);
int min = 0;
int max = slen;
int i = 0;
int j = 0;
while(s[i])
{
if(s[i] == 'I')
perm[j++] = min++;
else
perm[j++] = max--;
i++;
}
perm[j] = min;
*returnSize = plen;
return perm;
}