如题,我们要知道这个字符串中其他字符距离C的最短距离,因此我们可以先把所有的C的下标添加队列里去,采用多源BFS解决:
class Solution {
public:
struct node{
int i,w;
};
vector<int> shortestToChar(string s, char c) {
vector<int> res(s.length(),0x3f3f3f3f);
queue<node> q;
for(int i=0;i<s.length();i++){
if(s[i]==c) q.push({i,0});
}
while(q.size()){
auto t=q.front();
q.pop();
if(t.i<0||t.i>=s.length()||res[t.i]!=0x3f3f3f3f) continue;
res[t.i]=t.w;
q.push({t.i+1,t.w+1});
q.push({t.i-1,t.w+1});
}
return res;
}
};
再深入思考一下,其实res[i]=min(i到它左边第一个c的距离,i到它右边第一个c的距离)
那我们该如何得到i到它左边第一个C的距离?我们可以维护一个变量,如果当前遍历的位置是c,那么变量清0,反之变量+1,变量初始化为INF
class Solution {
public:
#define INF 0x3f3f3f3f
vector<int> shortestToChar(string s, char c) {
vector<int> res(s.length(),0x3f3f3f3f);
int j=INF;
for(int i=0;i<s.length();i++){
if(s[i]==c) j=0;
else j++;
res[i]=j;
}
j=INF;
for(int i=s.length()-1;i>=0;i--){
if(s[i]==c) j=0;
else j++;
res[i]=min(res[i],j);
}
return res;
}
};
class Solution {
static final int INF=0x3f3f3f3f;
public int[] shortestToChar(String s, char c) {
int []res=new int[s.length()];
int j=INF;
for(int i=0;i<s.length();i++){
if(s.charAt(i)==c) j=0;
else j++;
res[i]=j;
}
j=INF;
for(int i=s.length()-1;i>=0;i--){
if(s.charAt(i)==c) j=0;
else j++;
res[i]=Math.min(j,res[i]);
}
return res;
}
}