增减字符串匹配
难度:
标签:
题目描述
代码结果
运行时间: 19 ms, 内存: 16.7 MB
/*
* 思路:我们可以使用双指针的方法从两端向中间填充数字。
* 我们初始化一个低指针low为0和一个高指针high为n。
* 我们遍历字符串s,如果s[i] == 'I',则将low的值赋给perm[i],然后增加low。
* 如果s[i] == 'D',则将high的值赋给perm[i],然后减少high。
* 在最后一个位置,将low或high的值赋给perm[n]。
* 使用Java Stream API实现上述逻辑。
*/
import java.util.stream.IntStream;
public class Solution {
public int[] diStringMatch(String s) {
int n = s.length();
int[] low = {0};
int[] high = {n};
int[] perm = IntStream.range(0, n)
.map(i -> s.charAt(i) == 'I' ? low[0]++ : high[0]--)
.toArray();
perm = IntStream.concat(IntStream.of(perm), IntStream.of(low[0])).toArray();
return perm;
}
}
解释
方法:
该题解采用了两个指针策略,up 和 down。up 从0开始递增,代表在排列中下一个最小的数字;down 从n开始递减,代表在排列中下一个最大的数字。遍历给定的字符串s,根据每个字符是'I'(递增)还是'D'(递减),从up或down取值填充结果数组。最后一个位置用剩余的up或down填充,保证所有数字都被使用。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在字符串s中每个字符处理时选择更新up或down而不是同时更新两个指针?
▷🦆
在字符串s的处理完毕后,为何剩余的up或down的值可以直接用于填充数组的最后一个位置?这样做有何保证?
▷🦆
如果给定字符串s全是'I'或全是'D',这种情况下算法的表现如何?会不会有特殊的处理方式或优化?
▷🦆
代码中对于字符'I'和'D'的处理逻辑为何选择将较小的数赋给'I',较大的数赋给'D'?这样的逻辑有何特定的优势?
▷