给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。
示例 1:
输入: S = “loveleetcode”, C = ‘e’
输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]
说明:
字符串 S 的长度范围为 [1, 10000]。
C 是一个单字符,且保证是字符串 S 里的字符。
S 和 C 中的所有字母均为小写字母。
思路:开辟一个和字符串相同长度的整型数组,扫描一遍字符串,把字符串里字符c的位置改成0,其他的改成一个较大的数以防后期混淆。开一个ArrayLitst记录整型数组里0所在的位置,把第一个和最后一个0的位置之前或之后写成递增的数列,现在就剩中间的啦,写一个方法,传两个相邻的0的位置进去,用两个指针从两边往中间靠,就可以了。
class Solution {
public int[] shortestToChar(String S, char C) {
char[] n = S.toCharArray();
int N = n.length;
int[] m = new int[N];
ArrayList<Integer> count = new ArrayList();
for (int i = 0; i < N; i++) {//记录0的位置,把其他位置置为比较大的数,我这里是数组的长度加一。
if (n[i] == C) {
m[i] = 0;
count.add(i);
} else m[i] = N + 1;
}
int k = count.get(0);//第一个0的位置
for (int l = 0; l < k; l++) {//把第一个0之前的数变成从左往右递减的
m[k - l - 1] = l + 1;
}
k = count.get(count.size() - 1);//最后一个0
for (int l = k; l < N; l++) {//最后一个0之后的变成从左往右递增的
m[l] = l - k;
}
for (int i = 0; i < count.size() - 1; i++) {//循环每个0的位置
test(m, count.get(i), count.get(i + 1));//传这个0的位置和下一个0的位置
}
return m;
}
static void test(int[] n, int i, int j) {//改两个0之间的数,从两个零的位置往中间该,两边往中间递增
int left = i + 1;
int right = j - 1;
int k = 1;
while (left <= right) {
n[left] = n[right] = k;
k++;
left++;
right--;
}
return;
}
}