题目来源于力扣(LeetCode)
一、题目
说明:
- 字符串
S
的长度范围为[1, 10000]
。C
是一个单字符,且保证是字符串S
里的字符。S
和C
中的所有字母均为小写字母。
二、解题思路
-
定义两个数组,分别用于记录正序与倒序遍历字符串 S 时,各元素与字符元素 C 之间的距离
-
最后将两个数组进行比较,取最小值
三、代码实现
public static int[] shortestToChar(String S, char C) {
int[] ascArr = new int[S.length()];
int[] descArr = new int[S.length()];
char[] sarr = S.toCharArray();
// 记录元素与 C 元素的距离,初始值设大值,为数组长度
int count = sarr.length;
for (int i = 0; i < sarr.length; i++) {
if (sarr[i] == C) {
ascArr[i] = 0;
// 目标元素出现后,count开始为零,其后的排序为1,2,3...
count = 0;
} else {
ascArr[i] = ++count;
}
}
count = sarr.length;
for (int i = sarr.length - 1; i >= 0; i--) {
if (sarr[i] == C) {
descArr[i] = 0;
count = 0;
} else {
descArr[i] = ++count;
}
}
// 取两个数组中元素小的值
for (int i = 0; i < ascArr.length; i++) {
ascArr[i] = Math.min(ascArr[i], descArr[i]);
}
return ascArr;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
String S = "loveleetcode";
char C = 'e'; // output: {3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0}
int[] result = shortestToChar(S, C);
System.out.println(Arrays.toString(result));
}