前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode-821-Shortest Distance to a Character

leetcode-821-Shortest Distance to a Character

作者头像
chenjx85
发布2018-05-21 18:17:36
6920
发布2018-05-21 18:17:36
举报

题目描述:

Given a string S and a character C, return an array of integers representing the shortest distance from the character C in the string.

Example 1:

Input: S = "loveleetcode", C = 'e'
Output: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]

Note:

  1. S string length is in [1, 10000].
  2. C is a single character, and guaranteed to be in string S.
  3. All letters in S and C are lowercase.

要完成的函数:

vector<int> shortestToChar(string S, char C) 

说明:

1、给定一个字符串S和字符C,找到字符串S中字符C的位置(可能有多个字符C),返回字符串S中所有字符距离最近的字符C的距离。

比如S为leetcode,C为e,那么返回的距离vector就是[3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]。

2、这道题题意很清晰,也有点像之前做过的一道题,笔者在这里模仿那道题的做法。

给一个例子说明一下,比如S为leetcodell,C为e。

那么我们先把每个字符都跟它右边或者本身的e比较距离,如果右边没有e了,那么插入INT_MAX。

遍历一遍字符串S,我们可以得到[1,0,0,4,3,2,1,0,INT_MAX,INT_MAX]。

接着我们再把每个字符都跟它左边或者本身的e比较距离,这个距离跟上述得到的距离,取一个最小值。如果左边没有e了,那么不做处理。

遍历一遍字符串S,最后得到的距离vector就是我们要的了。

上述做法,其实是把每个左边有e右边也有e的字符,计算一下距离左边的距离,再计算一下距离右边的距离,然后取一个最小值。

对于那些只有右边有e的字符,只处理一次,对于只有左边有e的字符,也只处理一次。

代码实现如下(附详解),分享给大家:

    vector<int> shortestToChar(string S, char C) 
    {
        vector<int>index;//记录S中C的位置
        vector<int>res;//最后要返回的距离vector
        int s1=S.size();
        for(int i=0;i<s1;i++)//不断插入C的位置
        {
            if(S[i]==C)
                index.push_back(i);
        }
        int i=0,j=0,s2=index.size();
        while(i<s1)//计算每个字符跟右边C的距离
        {
            if(j<s2)//如果右边有C
            {
                if(i<index[j])
                {
                    res.push_back(index[j]-i);
                    i++;
                }
                else if((i==index[j]))
                {
                    res.push_back(0);
                    j++;
                    i++;
                }
            }
            else//如果右边没有C,那么插入INT_MAX
            {
                res.push_back(INT_MAX);
                i++;
            }
        }
        i=s1-1,j=s2-1;
        while(j>=0)//如果左边有C,计算每个字符跟左边C的距离
        {
            if(i>index[j])
            {
                res[i]=min(res[i],i-index[j]);//只保留最小值
                i--;
            }
            else if((i==index[j]))
            {
                j--;
                i--;
            }
        }
        return res;
    }

上述代码实测15ms,因为服务器接受到的cpp submissions有限,所以没有打败的百分比。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 要完成的函数:
  • 说明:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档