【LeetCode每日一题】821. 字符的最短距离

130 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。

个人博客链接:bbstudy.net/ (等毕业论文做好后续会完善相关功能)

​4.19:字符的最短距

LeetCode 821,点击题目可直接跳转至LeetCode

题解一:暴力

首先将字符串s中所有字符c的位置存入数组中,然后遍历字符串s,假设当前遍历位置为i,再二重循环遍历所有字符c的位置,找出两个下标之间的最小距离。

时间复杂度:

C++代码:

class Solution {
public:
    vector<int> shortestToChar(string s, char c) {
        vector<int> pos_arr;
        int n=s.length();
        for(int i=0;i<n;i++){
            if(s[i]==c) pos_arr.push_back(i);
        }
        vector<int> ans(n,0x3f3f3f3f);
        for(int i=0;i<n;i++){
            for(auto j:pos_arr){
                ans[i]=min(ans[i],abs(i-j));
            }
        }
        return ans;
    }
};

题解二:两次遍历

  • 第一次遍历,从左到右遍历,找出s[i]到左侧最近的字符c的距离
  • 第二次遍历,从右到左遍历,找出s[i]到右侧最近的字符c的距离

然后选择其中的最小值即可。

注意:可能存在此时并没出现过字符c的情况(例如:从左到右遍历时,左侧并没有字符c,从右到左遍历同理)所以需要初始化一个最大值,为方便处理:

  • 从左开始遍历时,我们可以初始字符c的位置为:pos=npos=-n,如果未出现则取:ipos>=ni-pos>=n,显然可行
  • 从右开始遍历时,我们可以初始字符c的位置为:pos=2npos=2n,如果未出现则取:posi>npos-i>n,显然可行

当然也可以直接初始化非常大的值。

C++代码:

class Solution {
public:
    vector<int> shortestToChar(string s, char c) {
        int n=s.length();
        vector<int> ans(n);
        int pos=-n;
        for(int i=0;i<n;i++){
            if(s[i]==c) pos=i;
            ans[i]=i-pos;
        }
        pos=2*n;
        for(int i=n-1;i>=0;i--){
            if(s[i]==c) pos=i;
            ans[i]=min(ans[i],pos-i);
        }
        return ans;
    }
};