算法小知识-----04.19-----字符的最短距离

92 阅读2分钟

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

今天才周二,放假后遗症 + 假期等待焦虑综合征,所幸今天遇到简单题

字符的最短距离

该题出自力扣的821题 —— 字符的最短距离【简单题】,简单题也可以复杂实现,也可以为了应付用例达到较低的复杂度,但是我认为,更好的应该是领悟解题思路。

审题

给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。
返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。
两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数。

  • 该题的题意也很简单,给出一个字符串,并且给出一个字符;字符在字符串中至少存在一次,需要求出字符串的每一个字符距离指定字符的最短距离
  • 分析得出,字符距离指定字符最短的距离,无非就是Math.min(左边的距离,右边的距离)
  • 解题:左边最短距离填充 + 右边最短 + 比较
    • 定义一个数组,长度为字符串的长度
    • 循环,初始变量为0和字符出现的初始值,因为是左边开始遍历,所以需要初始值为-n(需要考虑第一个值不为指定字符时,长度应该为最长,后续会修改)
    • 右循环,初始字符出现下标 = 最大值(n + n),与上述循环区别在于比较最小值
  • 时间复杂度O(n),因为n = 字符串的长度
  • 空间复杂度O(1)

编码

class Solution {
    public int[] shortestToChar(String s, char c) {
        //从左往右找,再从右往左找
        int n = s.length();
        int[] answer = new int[n];
        for (int i = 0,index = -n; i < n; i++) {
            if (s.charAt(i) == c){
                index = i;
            }
            answer[i] = i - index;
        }
        //从右往左,并且abs
        for (int i = n -1,index = n + n; i >= 0 ; i--) {
            if (s.charAt(i) == c)index = i;
            answer[i] = Math.min(answer[i],Math.abs(i - index));
        }
        return answer;
    }
}

image.png