解题思路:
仔细观察字符串中的每个字符,你就能发现每个字符都在两个target字符之间或者在边界和target之间,那么最多只用正向遍历一次反向遍历一次就能够计算每个字符离最近的target的距离。初始化都是最大距离(即字符串长度),然后正向遍历,根据target的位置更新target右边字符的距离,再反向遍历,根据target的位置更新target左边字符的距离,代码如下:
class Solution {
public:
vector<int> shortestToChar(string s, char c) {
int n = s.size();
int pre = n - 1;
vector<int> ans(n, pre);
for(int i = 0; i < n; i ++) {
if(s[i] == c) {
ans[i] = 0;
pre = i;
} else {
ans[i] = abs(pre - i);
}
}
pre = 0;
for(int i = n - 1; i >= 0; i --) {
if(s[i] == c) {
pre = i;
} else {
ans[i] = min(ans[i], abs(pre - i));
}
}
return ans;
}
};