字符的最短距离
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.0 MB
/*
* 题目思路:
* 使用Java Stream和并行处理,我们可以同时从左向右和从右向左扫描。
* 通过保存最近的字符c的下标,我们可以计算每个位置的最小距离。
*/
import java.util.stream.IntStream;
public int[] shortestToCharStream(String s, char c) {
int n = s.length();
int[] answer = new int[n];
// 从左向右扫描
IntStream.range(0, n).parallel().forEach(i -> {
int left = s.substring(0, i + 1).lastIndexOf(c);
int right = s.indexOf(c, i);
if (left == -1) left = Integer.MAX_VALUE;
if (right == -1) right = Integer.MAX_VALUE;
answer[i] = Math.min(Math.abs(i - left), Math.abs(right - i));
});
return answer;
}
解释
方法:
该题解使用了两次遍历的方法。第一次正向遍历字符串,记录每个位置距离左侧最近的字符 c 的距离。第二次反向遍历字符串,更新每个位置距离右侧最近的字符 c 的距离。最终答案取两次遍历结果的最小值。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在两次遍历中,您是如何决定初始化prev变量为float('-inf')和float('inf')的?这种初始化对算法的逻辑有什么具体影响?
▷🦆
在第二次遍历时,即使已经有了一个距离值,为什么还要使用min函数来更新answer数组?能否举例说明其中的必要性?
▷🦆
在处理字符串边界情况时,比如字符串s的长度为1或字符c在字符串s中只出现一次,这种方法处理上有什么特别需要注意的吗?
▷