1. 程式人生 > 其它 >821.字元的最短距離

821.字元的最短距離

821. 字元的最短距離

題目

給你一個字串 s 和一個字元 c ,且 c 是 s 中出現過的字元。

返回一個整數陣列 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中從下標 i 到離它 最近 的字元 c 的 距離 。

兩個下標i 和 j 之間的 距離 為 abs(i - j) ,其中 abs 是絕對值函式。

示例 1:

輸入:s = "loveleetcode", c = "e"
輸出:[3,2,1,0,1,0,0,1,2,2,1,0]
解釋:字元 'e' 出現在下標 3、5、6 和 11 處(下標從 0 開始計數)。
距下標 0 最近的 'e' 出現在下標 3 ,所以距離為 abs(0 - 3) = 3 。
距下標 1 最近的 'e' 出現在下標 3 ,所以距離為 abs(1 - 3) = 2 。
對於下標 4 ,出現在下標 3 和下標 5 處的 'e' 都離它最近,但距離是一樣的 abs(4 - 3) == abs(4 - 5) = 1 。
距下標 8 最近的 'e' 出現在下標 6 ,所以距離為 abs(8 - 6) = 2 。

示例 2:

輸入:s = "aaab", c = "b"
輸出:[3,2,1,0]

提示:
1 <= s.length <= 104
s[i] 和 c 均為小寫英文字母
題目資料保證 c 在 s 中至少出現一次

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/shortest-distance-to-a-character
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題解

算距離那必然會循壞,假設s = "aaab", c = "b",第一次迴圈可以找出b的位置,但是aaa與它的距離沒辦法計算,這樣可以從後往前在迴圈一次。

從前往後遍歷一遍,遇見e就置0,記錄位置,更新距離。
從後往前遍歷一遍,遇見e就記錄位置,更新每個元素與其的距離。

class Solution {
    public int[] shortestToChar(String s, char c) {
        int len = s.length();
        int [] answer = new int [len];
        int i=0;
        int flag=-1;//標記字元c的下標
        for(;i<len;i++){
            if(s.charAt(i)==c){
                flag = i;
                continue;
            }
            if(flag!=-1){
                answer[i] = Math.abs(flag-i);
            }else{
                answer[i] = Integer.MAX_VALUE; //需要更新最小值,那麼在第一個標記之前的就需要賦最大值
            }
        }
        //此時flag是最後一個c的位置,最後一個c後面的肯定離c更近,所以我們可以直接從flag的前一個位置開始更新
        for(i=flag-1;i>=0;i--){
            if(s.charAt(i)==c){
                flag = i;
                continue;
            }
            answer[i] = Math.min(answer[i],Math.abs(flag-i));
        } 
    return answer;
    }
}