其他分享
首页 > 其他分享> > 增减字符串匹配

增减字符串匹配

作者:互联网

增减字符串匹配

给定只含 “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