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.

这道题给了我们一个字符串S,和一个字符C,让我们求字符串中每个字符到字符C到最短距离,这里的字符C可能有多个。题目中给的例子中就是有多个e,每个e的位置一定是0,其他位置的值是到其最近的e的距离。最原始粗犷的方法肯定是对于每个非e的字符,左右两个方向来查找e,令博主感到意外的是,这种暴力搜索的方法居然可以通过OJ,太仁慈了啊,参见代码如下:

解法一:

class Solution {
public:
vector<int> shortestToChar(string S, char C) {
int n = S.size();
vector<int> res(n, n);
for (int i = ; i < n; ++i) {
if (S[i] == C) {res[i] = ; continue;}
int j = i + ;
while (j < n && S[j] != C) ++j;
if (j < n) res[i] = j - i;
j = i - ;
while (j >= && S[j] != C) --j;
if (j >= ) res[i] = min(res[i], i - j);
}
return res;
}
};

一般来说,优化线性搜索的方法就是用二分搜索法,这里我们先把所有为字符C的位置存入数组idx,因为是按顺序遍历的,所以idx数组也是有序的,这为二分搜索创造了条件。然后对于数组中的每一个位置,我们都在idx数组中二分查找不小于该位置的数,这时候要分情况讨论一下,如果找不到这样的数的时候,说明所有字符C的位置都在当前位置的左边,那么我们取idx数组中最后一个数,就是左边最近的一个字符C,求出距离即可。如果返回的是idx数组中的首数字,说明当前的位置是字符C,或者最近的字符C在右边,那么只要用这个首数字减去当前位置就是最近距离了。对于其他情况,左右两边都有字符C,所以我们都要各自计算一下距离,然后取较小的那个即可,参见代码如下:

解法二:

class Solution {
public:
vector<int> shortestToChar(string S, char C) {
vector<int> res, idx;
for (int i = ; i < S.size(); ++i) {
if (S[i] == C) idx.push_back(i);
}
for (int i = ; i < S.size(); ++i) {
auto it = lower_bound(idx.begin(), idx.end(), i);
if (it == idx.end()) res.push_back(i - *(--it));
else if (it == idx.begin()) res.push_back(*it - i);
else {
int d1 = *it - i, d2 = i - *(--it);
res.push_back(min(d1, d2));
}
}
return res;
}
};

还有一种类似距离场的解法,与解法一不同的是,这里是对于每个是字符C的位置,然后分别像左右两边扩散,不停是更新距离,这样当所有的字符C的点都扩散完成之后,每个非字符C位置上的数字就是到字符C的最短距离了,参见代码如下:

解法三:

class Solution {
public:
vector<int> shortestToChar(string S, char C) {
int n = S.size();
vector<int> res(n, n);
for (int i = ; i < n; ++i) {
if (S[i] != C) continue;
res[i] = ;
for (int j = i + ; j < n && S[j] != C; ++j) {
res[j] = min(res[j], j - i);
}
for (int j = i - ; j >= && S[j] != C; --j) {
res[j] = min(res[j], i - j);
}
}
return res;
}
};

下面这种方法也是建立距离场的思路,不过更加巧妙一些,只需要正反两次遍历就行。首先进行正向遍历,若当前位置是字符C,那么直接赋0,否则看如果不是首位置,那么当前位置的值等于前一个位置的值加1。这里不用和当前的值进行比较,因为这个算出来的值不会大于初始化的值。然后再进行反向遍历,要从倒数第二个值开始往前遍历,用后一个值加1来更新当前位置的值,此时就要和当前值做比较,取较小的那个,参见代码如下:

解法四:

class Solution {
public:
vector<int> shortestToChar(string S, char C) {
vector<int> res(S.size(), S.size());
for (int i = ; i < S.size(); ++i) {
if (S[i] == C) res[i] = ;
else if (i > ) res[i] = res[i - ] + ;
}
for (int i = (int)S.size() - ; i >= ; --i) {
res[i] = min(res[i], res[i + ] + );
}
return res;
}
};

参考资料:

https://leetcode.com/problems/shortest-distance-to-a-character/

https://leetcode.com/problems/shortest-distance-to-a-character/discuss/156216/2-pass-solution-in-C%2B%2B-(beats-100-submissions).

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Shortest Distance to a Character 到字符的最短距离的更多相关文章

  1. [Swift]LeetCode821. 字符的最短距离 | Shortest Distance to a Character

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

  2. 【LeetCode】821. Shortest Distance to a Character 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 过两遍数组 日期 题目地址:https://leet ...

  3. LeetCode 821 Shortest Distance to a Character 解题报告

    题目要求 Given a string S and a character C, return an array of integers representing the shortest dista ...

  4. 821. Shortest Distance to a Character - LeetCode

    Question 821. Shortest Distance to a Character Solution 思路:遍历字符串S,遇到与字符C相等就分别向左/右计算其他字符与该字符的距离,如果其他字 ...

  5. [LeetCode&Python] Problem 821. Shortest Distance to a Character

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

  6. [Solution] 821. Shortest Distance to a Character

    Difficulty: Easy Problem Given a string S and a character C, return an array of integers representin ...

  7. 【Leetcode_easy】821. Shortest Distance to a Character

    problem 821. Shortest Distance to a Character solution1: class Solution { public: vector<int> ...

  8. LeetCode算法题-Shortest Distance to a Character(Java实现)

    这是悦乐书的第321次更新,第343篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第191题(顺位题号是821).给定字符串S和字符C,返回一个整数数组,表示字符串中所有 ...

  9. Leetcode821.Shortest Distance to a Character字符的最短距离

    给定一个字符串 S 和一个字符 C.返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组. 示例 1: 输入: S = "loveleetcode", C ...

随机推荐

  1. java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。

    java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...

  2. PageRank算法--从原理到实现

    本文将介绍PageRank算法的相关内容,具体如下: 1.算法来源 2.算法原理 3.算法证明 4.PR值计算方法 4.1 幂迭代法 4.2 特征值法 4.3 代数法 5.算法实现 5.1 基于迭代法 ...

  3. [物理学与PDEs]第5章第6节 弹性静力学方程组的定解问题

    5. 6 弹性静力学方程组的定解问题 5. 6. 1 线性弹性静力学方程组 1.  线性弹性静力学方程组 $$\bee\label{5_6_1_le} -\sum_{j,k,l}a_{ijkl}\cf ...

  4. 面试经验合集-Java后端<一>

    面试一:CDKHXJSYJS   时间:2018-12-29 周六 地点:航天科技大厦32楼   一 技术题目 <回忆版> 1.上下转型 2.Java异常:分类.处理.设计 3.二叉排序树 ...

  5. springboot上传文件 & 不配置虚拟路径访问服务器图片 & springboot配置日期的格式化方式 & Springboot配置日期转换器

    1.    Springboot上传文件 springboot的文件上传不用配置拦截器,其上传方法与SpringMVC一样 @RequestMapping("/uploadPicture&q ...

  6. 【easy】110. Balanced Binary Tree判断二叉树是否平衡

    判断二叉树是否平衡 a height-balanced binary tree is defined as a binary tree in which the depth of the two su ...

  7. JVM虚拟机

    一.JAVA虚拟机内存模型: 1.程序计数器:非常小的内存,用于存放下一条运行的指令: 每一个线程都必须有一个独立的程序计数器,用于记录下一条要运行的指令,是一块线程私有的内存空间,CPU时间切片 2 ...

  8. PyMysql的LIKE查询%问题

    今天写一个模糊匹配的接口的时候,发现PyMysql的防注入方式会将%给转义,就算是写两个%%也是无用,依旧查不出来结果 Google翻了,Baidu翻了,一样没有适用的解决方法. 后来灵机一动想到了方 ...

  9. Python--可迭代对象,迭代器,生成器

    记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...

  10. vue-cli 3.0

    安装 vue-cli 3.0 时报错 vue-cli3安装遇到的问题,卸载不掉旧版本,导致更新不了 vue-cli 2.9.6 版本卸载不了 作者:Runner_leaf链接:https://www. ...