力扣:821、字符的最短距离

给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。

示例 1:

输入: S = “loveleetcode”, C = ‘e’
输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]

说明:

字符串 S 的长度范围为 [1, 10000]。
C 是一个单字符,且保证是字符串 S 里的字符。
S 和 C 中的所有字母均为小写字母。

思路:开辟一个和字符串相同长度的整型数组,扫描一遍字符串,把字符串里字符c的位置改成0,其他的改成一个较大的数以防后期混淆。开一个ArrayLitst记录整型数组里0所在的位置,把第一个和最后一个0的位置之前或之后写成递增的数列,现在就剩中间的啦,写一个方法,传两个相邻的0的位置进去,用两个指针从两边往中间靠,就可以了。

class Solution {
    public int[] shortestToChar(String S, char C) {
        char[] n = S.toCharArray();
        int N = n.length;
        int[] m = new int[N];
        ArrayList<Integer> count = new ArrayList();
         for (int i = 0; i < N; i++) {//记录0的位置,把其他位置置为比较大的数,我这里是数组的长度加一。
            if (n[i] == C) {
                m[i] = 0;
                count.add(i);
                  } else m[i] = N + 1;
        }
        int k = count.get(0);//第一个0的位置
        for (int l = 0; l < k; l++) {//把第一个0之前的数变成从左往右递减的
            m[k - l - 1] = l + 1;
        }
        k = count.get(count.size() - 1);//最后一个0
        for (int l = k; l < N; l++) {//最后一个0之后的变成从左往右递增的
            m[l] = l - k;
        }
        for (int i = 0; i < count.size() - 1; i++) {//循环每个0的位置
            test(m, count.get(i), count.get(i + 1));//传这个0的位置和下一个0的位置
        }
        return m;
    }
      static void test(int[] n, int i, int j) {//改两个0之间的数,从两个零的位置往中间该,两边往中间递增
        int left = i + 1;
        int right = j - 1;
        int k = 1;
        while (left <= right) {
            n[left] = n[right] = k;
            k++;
            left++;
            right--;
        }
        return;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值