算法随笔_21:字符的最短距离

上一篇:算法随笔_20:区间子数组个数 -CSDN博客

=====================

题目描述如下:

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

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

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

示例 1:

复制代码
输入:s = "loveleetcode", c = "e"
输出:[3,2,1,0,1,0,0,1,2,2,1,0]
解释:字符 'e' 出现在下标 3、5、6 和 11 处(下标从 0 开始计数)。
距下标 0 最近的 'e' 出现在下标 3 ,所以距离为 abs(0 - 3) = 3 。
距下标 1 最近的 'e' 出现在下标 3 ,所以距离为 abs(1 - 3) = 2 。
对于下标 4 ,出现在下标 3 和下标 5 处的 'e' 都离它最近,但距离是一样的 abs(4 - 3) == abs(4 - 5) = 1 。
距下标 8 最近的 'e' 出现在下标 6 ,所以距离为 abs(8 - 6) = 2 。

=====================

算法思路:

对于下标i到离它最近的字符 c 的距离,我们设为dst_i。我们可以把dst_i它分开来看:

  1. 离下标i左侧最近的距离dstL_i。

  2. 离下标i右侧最近的距离dstR_i。

我们取两个距离最近的那个值即是dst_i。

对于计算dstL_i,我们先初始一个变量c_indL=-1。然后从左往右遍历数组,每访问一个元素,我们判断这个元素是否是字符c。

如果是的话,我们把它的下标记录到变量c_indL中,这样的话变量c_indL永远是离正在访问元素最近的那个。

如果不是字符c,且c_indL大于等于0,那么我们可以记录下dstL_i就等于当前的元素下标减去c_indL。如果c_indL为-1,那就说明当前元素的左侧没有字符c,它的距离应该是无限大。算法实现中我们可以设置当前元素的dstL_i为字符串的长度s.length。因为对于dst_i,它的最大可能值只能是s.length-1。

这样,一次遍历下来,所有元素的dstL_i都已经找到,我们把这些数值存储到数组dstL中。

同理,我们可以从右往左遍历数组,找出所有元素的dstR_i的值,我们把这些数值存储到数组dstR中。

最后再遍历一遍整个数组,取两个距离dstL_i和dstR_i的最小值做为dst_i,并存储到dst数组中。

此算法的时间复杂度为O(n)

下面是代码实现:

复制代码
class Solution(object):
    def shortestToChar(self, s, c):
        """
        :type s: str
        :type c: str
        :rtype: List[int]
        """
        s_len=len(s)
        dstL=[0]*s_len
        dstR=[0]*s_len
        dst=[]
        c_indL=-1
        c_indR=-1
        for i in range(s_len):
            tmp_cL=s[i]
            if tmp_cL==c:
                c_indL=i
                dstL[i]=0
            elif c_indL==-1:
                dstL[i]=s_len
            else:
                dstL[i]=i-c_indL
                
            r_ind=s_len-i-1
            tmp_cR=s[r_ind]
            if tmp_cR==c:
                c_indR=r_ind
                dstR[r_ind]=0
            elif c_indR==-1:
                dstR[r_ind]=s_len
            else:
                dstR[r_ind]=c_indR-r_ind
                
        for i in range(s_len):
            dst.append(min(dstL[i],dstR[i]))
        return dst     
相关推荐
2501_924878593 小时前
强光干扰下漏检率↓78%!陌讯动态决策算法在智慧交通违停检测的实战优化
大数据·深度学习·算法·目标检测·视觉检测
耳总是一颗苹果3 小时前
排序---插入排序
数据结构·算法·排序算法
YLCHUP4 小时前
【联通分量】题解:P13823 「Diligent-OI R2 C」所谓伊人_连通分量_最短路_01bfs_图论_C++算法竞赛
c语言·数据结构·c++·算法·图论·广度优先·图搜索算法
花火|4 小时前
算法训练营day62 图论⑪ Floyd 算法精讲、A star算法、最短路算法总结篇
算法·图论
GuGu20244 小时前
新手刷题对内存结构与形象理解的冲突困惑
算法
汤永红5 小时前
week4-[二维数组]平面上的点
c++·算法·平面·信睡奥赛
晴空闲雲5 小时前
数据结构与算法-字符串、数组和广义表(String Array List)
数据结构·算法
颜如玉7 小时前
位运算技巧总结
后端·算法·性能优化
冷月半明7 小时前
时间序列篇:Prophet负责优雅,LightGBM负责杀疯
python·算法
秋难降7 小时前
聊聊 “摸鱼式” 遍历 —— 受控遍历的小心机
数据结构·算法·程序员