https://leetcode-cn.com/problems/shortest-distance-to-a-character/
[制卡]
/*** 总体思路 双数组 双指针** 先获取到对应的字母位于数组中的所有下标idxs* 重新遍历 s,从idxs[0]和idxs[1]开始,用 last 和next存储当前对比的下标,* idx 存储当前对比的索引,用当前下标对比,取 prev-i 和 next-i的绝对值中较小的一个放入结果中* 当i === next的时候, -重置last, next ,idx*/export function shortestToChar(s: string, c: string): number[] {if(!s.length) return []let res: number[] = []let idxs: number[] = []for (let i = 0; i < s.length; i++) {if (s[i] === c) idxs.push(i)}if(!idxs.length) return []idxs.push(999999999)let prev = idxs[0]let next = idxs[1]let idx = 1for (let i = 0; i < s.length; i++) {// 这一步技巧res.push(Math.min(Math.abs(prev-i),next-i))if (i === next) {prev = nextidx++next = idxs[idx]}}return res}
/**
* 还是错了。在取 i - index[0] 和 i - index[1]的绝对值中较小的一个放入结果中没弄明白;
* @param s
* @param c
function shortestToChar(s: string, c: string): number[] {
let res: number[] = []
let i = 0; //
let j = -1; // 记录上一个 c 的位置
let n = 0;
let resBack: number[] = [];// 缓存
for (; i < s.length; i++) {
if (s[i] === c) {
const abs = Math.abs(i - j)
if (abs === 0) {
res.push(0)
} else {
if (j < 0) {
n = i
for (let k = n; k > 0; k--) {
resBack.push(k)
}
res = resBack.reverse().concat(res)
n = 0
resBack = []
}
if (j >= 0 && j < i) {
n = abs % 2 ? abs : abs + 1
let midkey = Math.floor(n / 2)
for (let k = 1; k < midkey; k++) {
resBack.push(k)
}
for (let k = midkey; k > 0; k--) {
resBack.push(k)
}
res = resBack.concat(res)
n = 0
resBack = []
}
if (j === i) {
res.push(0)
}
j = i
}
}
}
return res
};
*/
