题目描述
-
增减字符串匹配
由范围 [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"
解题思路
法1
方法1:双指针
-
根据字符串s的每个字符,逐个确定排列perm的元素。我们使用两个指针low和high,它们分别表示当前可以选择的最小值和最大值。
-
遍历字符串s,如果当前字符是'I',我们将low赋给perm的当前位置,然后low加1;如果当前字符是'D',我们将high赋给perm的当前位置,然后high减1。
-
最后,我们将low赋给perm的最后一个位置,因为low和high在遍历过程中已经交错了。这样,我们就得到了符合条件的排列perm。
-
时间复杂度(O(n)) -
空间复杂度(O(1))
执行结果
法1
func diStringMatch(s string) []int {
n := len(s)
low, high := 0, n
perm := make([]int, n+1)
for i := 0; i < n; i++ {
if s[i] == 'I' {
perm[i] = low
low++
} else {
perm[i] = high
high--
}
}
perm[n] = low
return perm
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 4 ms , 在所有 Go 提交中击败了 97.50% 的用户 内存消耗: 4.8 MB , 在所有 Go 提交中击败了 100.00% 的用户 通过测试用例: 95 / 95 炫耀一下:
本文由 mdnice 多平台发布