821. Shortest Distance to a Character

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求
Given a string S and a character C, return an array of integers representing the shortest distance from the character C in the string.
这里写图片描述
给定一个字符串和其中的一个特定的字符,判断字符串中的字符到该种字符的最小距离,返回一个这样的最小距离表。

2,题目思路
个人最开始的思路就是遍历,然后找到特定的位置。再经过一次遍历,计算每个字符到给定字符位置的最小距离即可。
但是这样的遍历存在一些问题:比如开头和结尾处的字符要进行特殊的处理——因为距离之和第一个和最后一个给定字符位置有关。但中间的字符却和左右距离的最小值有关。如果要解决这样的问题,就要进行逊汗嵌套,对于每一个字符,计算其到每一个对应pos的距离的最小值。这样的开销稍微大一些,但是可解。

另一个解决思路为,使用前后两次遍历,对距离字符右方和字符左方的给定字符的距离进行计算,最后取最小值即可。

3,程序源码
1,

class Solution {
public:
    vector<int> shortestToChar(string S, char C) {
        int n = S.size();
        vector<int> res(n,0);
        vector<int> pos;
        for(int i=0;i<n;i++)
            if(S[i]==C)
                pos.push_back(i);

        for(int i =0;i<n;i++){
            if(S[i]!=C){
                int dis = n * n;
                for(int j = 0;j<pos.size();j++)
                    dis = min(dis, abs(pos[j] - i));                
                res[i]=dis;
            }
        }
        return res;
    }
};

2,

class Solution {
public:
    vector<int> shortestToChar(string S, char C) {
        int n = S.size();
        vector<int> res (n, n);
        int e_pos = -(n*n);

        for(int i = 0;i<n;i++)      //从前往后进行遍历
        {
            if(S[i] == C)
                e_pos = i;
            res[i] = min(res[i], abs(i-e_pos));
        }

        for(int i = n-1;i>=0;i--)   //从后往前遍历
        {
            if(S[i] == C)
                e_pos = i;
            res[i] = min(res[i], abs(i-e_pos));
        }

        return res;
    }
};

注:

  • vector<int> res (n,m);
    表示创建一个向量,长度为n,且每一个值均为m。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值