一起养成写作习惯!这是我参与「掘金日新计划 · 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;
}
}