给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。
方法一:暴力破解
时间复杂度O(N^2)
空间复杂度O(N)
class Solution {
public int[] shortestToChar(String S, char C) {
int[] res = new int[S.length()];
for(int i = 0; i < S.length(); i++){
res[i] = S.length();
}
for(int i = 0; i < S.length(); i++){
for(int j = 0; j < S.length(); j++){
if(S.charAt(j) == C && Math.abs(j - i) < res[i]){
res[i] = Math.abs(j - i);
}
}
}
return res;
}
}
方法二:左右两次遍历
时间复杂度:O(N),其中N是S的长度
空间复杂度:O(N)
class Solution {
public int[] shortestToChar(String S, char C) {
int N = S.length();
int[] res = new int[N];
int min = Integer.MIN_VALUE / 2;
for(int i = 0; i < N; i++){
if(S.charAt(i) == C) min = i;
res[i] = i - min;
}
int min2 = Integer.MAX_VALUE / 2;
for(int i = N - 1; i >= 0; i--){
if(S.charAt(i) == C) min2 = i;
res[i] = Math.min(min2 - i, res[i]);
}
return res;
}
}