821. 字符的最短距离

Posted by CodingWithAlice on July 2, 2021

821. 字符的最短距离

题目:

输入字符串 s 和字母 c,已知 c 在 s 中出现过。

返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。

备注:两个下标 ij 之间的 距离abs(i - j) ,其中 abs 是绝对值函数

解答:

  • 方法一:自己想的

image-20210702085054560

时间复杂度:O(n),空间复杂度:xx

主要逻辑:

遍历循环字符串,将字符串按照指定字符进行划分;对第一次/最后一次匹配到的单独处理

 var shortestToChar = function(s, c) {
     let res = [];
     let ifFirst = true;
     while(s.length > 0) {
         let index = s.indexOf(c);
         s = s.substring(index + 1,);
         let nextIndex = s.indexOf(c);
         // 当前 index 为 0
         if (index === 0) {
             res.push(0);
             ifFirst = false;
             continue
         }
         // 第一个匹配到的c
         if(ifFirst) {
             for(let i = index; i >= 0 ;i--) {
                 res.push(i);
             }
             ifFirst = false;
             // 第一次 + c 为最后一位
             if(!s) {
                 break
             }
             continue
         }

         // 中间
         if (index !== -1) {
             let mid = Math.ceil(index / 2);
             let isOdd = index % 2; 
             for(let i = 1; i <= index; i++) {
                 if(i <= mid) {
                     res.push(i);
                     continue
                 }
                 // 奇偶数
                 if(isOdd) {
                     mid--;
                     isOdd = 0;
                 }

                 res.push(mid--);
             }
             res.push(0);
             // 最后一个字母为 c 的情况
             if (!s) {
                 break
             }
             continue
         }


         // 最后一个 c 
         for(let i = 1; i < index ; i++) {
             res.push(i);
         }
         // c 后面还有内容
         if (index === -1) {
             for(let i = 1; i <= s.length ; i++) {
                 res.push(i);
             }
         }
         break
     }
     return res
 };
  • 方法二:

image-20210702104815446

时间复杂度:O(n),空间复杂度:xx

核心逻辑:比较当前 i 与前后字符串位置的大小,取较小者为结果

var shortestToChar = (s,c) => {
    let res = [];
    let now = s.indexOf(c);
    let prev = now;
    for(let i = 0;i < s.length ; i++) {
        now = s.indexOf(c, i);
        if (i <= prev) {
            res.push(now - i);
        }
        if (i > prev && i <= now) {
            let dis = Math.min((now - i), (i - prev));
            res.push(dis);
        }
        if (now === -1) {
            res.push(i - prev);
        }
        if (i === now) {
            prev = now;
        }
    }
    return res
}