821. 字符的最短距离 - 力扣

1. 题目

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

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

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

2. 示例

3. 分析

我们先尝试一下暴力解法:将目标字符每次出现的位置保存到数组中,然后遍历字符串依次比较每个字符与目标字符每次出现的位置进行比较,寻找较小值即可

cpp 复制代码
class Solution {
public:
    vector<int> shortestToChar(string s, char c) {
        vector<int> index;
        vector<int> ans;
        int n = s.size();

        // 记录目标字符出现的位置
        for(int i = 0; i < n; i++)
        {
            if(s[i] == c)
            {
                index.push_back(i);
            }
        }

        // 遍历字符串,对每个字符与目标字符出现下标进行比较,寻找较小值
        for(int i = 0; i < n; i++)
        {
            int minres = INT_MAX;
            for(int j = 0; j < index.size(); j++)
            {
                minres = min(minres, abs(index[j]-i));
            }
            ans.push_back(minres);
        }
        return ans;
    }
};

时间复杂度:O(N2)


能不能做到O(N),可以的:

问题可以转换成,对 每个字符s[i] 的下标 i,求

  • 每个字符s[i]到其左侧最近的字符 c 的距离。
  • 每个字符s[i]到其右侧最近的字符 c 的距离。

这两者的较小值。

分别对字符串从左往右、从右往左遍历。

从左往右:在遍历的同时记录二者的距离,也需更新目标字符的下标。但在刚开始遍历时,目标字符可能不存在,所以二者距离也因此不能记录,所以为了记录二者的距离,我们可以使用 -n 初始化目标字符下标,这里 n 是 字符串的长度,距离就为 abs(index - i)。若找到第一个目标字符,二者距离也为 abs(index - i)。

从右往左:同理。初始化目标字符下标为 2n**,** 这里 n 是 字符串的长度。顺便比较此时二者距离与从左往右遍历时二者距离哪个为较小者。

cpp 复制代码
class Solution {
public:
    vector<int> shortestToChar(string s, char c) {
        int n = s.size();
        vector<int> ans(n);
        
        // 从左往右
        for(int i = 0, index = -n; i < n; i++)
        {
            if(s[i] == c) index = i;
            ans[i] = i - index;
        }

        // 从右往左
        for(int i = n - 1, index = 2*n; i >= 0; i--)
        {
            if(s[i] == c) index = i;
            ans[i] = min(ans[i], index - i);
        }
        return ans;
    }
};
相关推荐
代码充电宝1 小时前
LeetCode 算法题【中等】189. 轮转数组
java·算法·leetcode·职场和发展·数组
杨小码不BUG8 天前
小鱼的数字游戏:C++实现与算法分析(洛谷P1427)
c++·算法·数组·信奥赛·csp-j/s
宁小法8 天前
PHP 数组 如何将新元素加到数组第一个位置(支持指定key => value)
php·数组·首个元素
摸鱼的老谭12 天前
Java学习之旅第一季-25:一维数组
java·开发语言·数组
hope_wisdom15 天前
C/C++数据结构之用数组实现栈
c语言·数据结构·c++·数组·
Tisfy19 天前
LeetCode 0611.有效三角形的个数:双指针
算法·leetcode·题解·双指针
递归尽头是星辰1 个月前
双指针与滑动窗口算法精讲:从原理到高频面试题实战
算法·双指针·滑动窗口·子串/子数组问题
pusue_the_sun1 个月前
每日算法题推送
算法·双指针
KarrySmile1 个月前
HOT100--Day23--153. 寻找旋转排序数组中的最小值,4. 寻找两个正序数组的中位数,20. 有效的括号
二分查找·数组··hot100·二分法·二分搜索·旋转排序数组
爱编程的化学家1 个月前
代码随想录算法训练营第六天 - 哈希表2 || 454.四数相加II / 383.赎金信 / 15.三数之和 / 18.四数之和
数据结构·c++·算法·leetcode·双指针·哈希