leetcode每日一题 821. 字符的最短距离

leetcode每日一题 821. 字符的最短距离

1.普通双指针
class Solution {
  public int[] shortestToChar(String s, char c) {
      int[] result = new int[s.length()];
      int l = 0;
      int r = 0;
      for (int i = 0; i < s.length(); i++) {
          if(s.charAt(i) == c){
              result[i] = 0;
              continue;
          }
          l = r = i;
          while (l >= 0 || r < s.length()) {
              if (l >= 0 && s.charAt(l) == c) {
                  result[i] = i - l;
                  break;
              }
              if (r < s.length() && s.charAt(r) == c) {
                  result[i] = r - i;
                  break;
              }
              r++;
              l--;
          }
      }
      return result;
  }
}

 

 

2.加点缓存,比如可以根据上一个元素的结果来计算这个元素的结果 

class Solution {
  public int[] shortestToChar(String s, char c) {
      //-1 左边 0当前元素 1右边
      int[][] db = new int[s.length()][2];
      //初始化第一个元素数据
      db[0][0] = s.indexOf("" + c);
      db[0][1] = db[0][0] > 0 ? 1 : 0;
      //循环遍历后续元素
      for (int i = 1; i < db.length; i++) {
          //获取字符
          char c1 = s.charAt(i);
          //如果是要找的字符,直接置为0
          if (c1 == c) {
              db[i][0] = 0;
              db[i][1] = 0;
              continue;
          }
          //如果上一个元素说离他最近的元素在他右边
          if (db[i - 1][1] == 1) {
              db[i][0] = db[i - 1][0] - 1;
              db[i][1] = 1;
              continue;
          }
          //如果上一个元素说离他最近的元素就是他
          if (db[i - 1][1] == 0) {
              db[i][0] = 1;
              db[i][1] = -1;
              continue;
          }
          boolean b = false;
          //最后一种可能 上一个元素说离他最近的在他左边
          for (int j = i + 1; j < Math.min(s.length(), i + db[i - 1][0] + 1); j++) {
              if(s.charAt(j) == c){
                  db[i][0] = j-i;
                  db[i][1] = 1;
                  b = true;
                  break;
              }
          }
          if(!b){
              db[i][0] = db[i-1][0]+1;
              db[i][1] = -1;
          }
      }
      int[] ints = new int[s.length()];
      for (int i = 0; i < ints.length; i++) {
          ints[i] = db[i][0];
      }
      return ints;
  }
}

 

 

posted @   java架构师1  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示