821. 字符的最短距离

124 阅读1分钟

leetcode-cn.com/problems/sh…

如题,我们要知道这个字符串中其他字符距离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;
    }
}