增减字符串匹配

题目要求

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/di-string-match
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目解法

我们首先考虑字符串中的第一个字符。如果S[0] == 'I',那么我们只要令A[0] == 0,就一定能满足A[0] < A[1]。如果S[0] == 'D',同样我们只需要令A[0] == N,就一定满足A[0] > A[1]

接下来每次我们都可以把数的集合中的最小值或最大值取出,并放到当前的位置。即从左向右扫描字符串,如果碰到'I'就取出当前最小的数,否则取出当前最大的数。

public class Solution {
    public int[] diStringMatch(String S) {
        int len = S.length();
        int low = 0, high = len;
        int[] ans = new int[len + 1];
        for (int i = 0; i < len; i++) {
            if (S.charAt(i) == 'I')
                ans[i] = low++;
            else
                ans[i] = high--;
        }
        ans[len] = low;
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(N),其中N是字符串S的长度。
  • 空间复杂度:O(N)。

   转载规则


《增减字符串匹配》 cyyyys 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
自除数 自除数
####题目要求 自除数 是指可以被它包含的每一位数除尽的数。 例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。 还有,自除数不允许包含 0 。 给定上边界和下边界数字,输出一
2019-09-10
下一篇 
汉明距离 汉明距离
题目要求两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y,计算它们之间的汉明距离。 注意:0 ≤ x, y < 231. 示例: 输入: x = 1, y = 4 输出: 2 解释:
2019-09-08
  目录