思路一:双指针
假如指定字符为a
第一种abcda,字符被指定字符包围,最小距离为到左右两边a的最小值,例如b的最小距离为min(a-b,b-a) => (4-1,1-0)
第二种bcda,左边无指定字符,最小距离为a-b,例如b的最小距离为a-b => (3-0)
第三种abcd,右边无指定字符,最小距离为b-a,例如b的最小距离为b-a => (1-0)
class Solution {
public int[] shortestToChar(String s, char c) {
int len = s.length();
int l=-1,r=-1;
int[] res = new int[len];
for(int i=0; i<len; i++) {
if(s.charAt(i) == c) {
r = i;
//开头
if(l==-1) {
int j=0;
while(j<=r) {
res[j] = r-j;
j++;
}
} else {//中间
int j=l+1;
while(j<=r) {
res[j] = Math.min(r-j,j-l);
j++;
}
}
l=r;
}
}
//结尾
int j = r + 1;
while(j<len) {
res[j]=j-r;
j++;
}
return res;
}
}
思路二:两次遍历
class Solution {
public int[] shortestToChar(String s, char c) {
int len = s.length();
//第一次
int l=0,r=0;
int[] res = new int[len];
for(int i=0; i<len; i++) {
if(s.charAt(i) == c) {
r = i;
while(l<=r) {
res[l] = r-l;
l++;
}
}
}
//后面可能存在未遍历到
while(l<=len-1) {
res[l] = l-r;
l++;
}
//第二次
l=0;
r=len-1;
for(int i=len-1; i>=0; i--) {
if(s.charAt(i) == c) {
l = i;
while(l<r) {
if(res[r]>r-l) res[r]= r-l;
r--;
}
}
}
return res;
}
}