增减字符串匹配
作者:互联网
增减字符串匹配
给定只含 “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]
分析
我们首先考虑字符串中的第一个字母。如果 S[0] == ‘I’,那么我们只要令 A[0] = 0,就一定能满足 A[0] < A[1]。如果 S[0] == ‘D’,同样我们只要令 A[0] = N,就一定能满足 A[0] > A[1]。
接下来,当我们考虑 S 中剩下的 N - 1 个字母时,还剩下 N 个数可以使用,这 N 个数为 [0 … N - 1] 或 [1 … N]。可以发现,由于 S[0] 的值已经确定,那么剩下 S 中的 N - 1 个字母和 N 个可用的数变成了一个和原问题相同,但规模为 N - 1 的问题。即如果 S[1] == ‘I’,我们就令 A[1] 为剩下数中最小的那个数;如果 S[1] == ‘D’,我们就令 A[1] 为剩下数中最大的那个数。
我们每次会把可以使用的数的集合中的最小值或最大值取出,并放到当前的位置,因此可以使用的数的集合总是连续的,就可以非常方便的进行维护。
这里使用两个值来记录当前可用的最大最小值,遍历字符串,字符是I则取最小值,字符是D则取最大值即可,遍历完字符串要将最后一个数字添加到返回的数组中。
class Solution {
public int[] diStringMatch(String s) {
int len = s.length();
int small = 0, big = len;
int res[] = new int[len+1];
for(int i = 0; i < len; i++){
char c = s.charAt(i);
if(c == 'I'){
res[i] = small;
small++;
}else if(c == 'D'){
res[i] = big;
big--;
}
}
res[len] = big;
return res;
}
}
标签:输出,匹配,big,int,res,len,增减,字符串 来源: https://blog.csdn.net/weixin_35576881/article/details/100064136