题目

给你一个字符串 s 和一个字符 c ,且 cs 中出现过的字符。

返回一个整数数组 answer ,其中 answer.length == s.lengthanswer[i]s 中从下标 i 到离它最近的字符 c距离

两个下标 ij 之间的距离abs(i - j) ,其中 abs 是绝对值函数。

来源:力扣(LeetCode)


解答

从左到右遍历一次,再从右到左遍历一次即可。

第一次遍历找的是距离左边最近的距离,第二次是右边。

代码如下:

class Solution {
public:
    vector<int> shortestToChar(string s, char c) {
        int n = s.size();
        vector<int> ret(n, n + 1);

        int pos = -1;
        for (int i = 0; i < n; ++i) {
            if (s[i] == c) {
                pos = i;
            }
            if (pos != -1) {
                ret[i] = i - pos;
            }
        }

        pos = -1;
        for (int i = n - 1; i >= 0; i--) {
            if (s[i] == c) {
                pos = i;
            }
            if (pos != -1) {
                ret[i] = min(ret[i], pos - i);
            }
        }

        return ret;
    }
};