【Leetcode】821. Shortest Distance to a Character

題目地址:

https://leetcode.com/problems/shortest-distance-to-a-character/

給定一個字符串ss和一個ss中字母cc,要求返回一個數組AA,其中A[i]A[i]等於s[i]s[i]與與其距離最近的那個cc的距離。

由於距離s[i]s[i]最近的cc要麼在其左邊要麼在其右邊,所以可以用遍歷兩遍的方式,從左到右一遍,從右到左一遍,每次遍歷用一個變量記錄最新出現的cc的位置,同時更新最短距離。代碼如下:

public class Solution {
    public int[] shortestToChar(String S, char C) {
        if (S == null || S.isEmpty()) {
            return new int[0];
        }
        
        int[] res = new int[S.length()];
    	
    	// 先從左向右遍歷,並計算每個字符與其最近的左邊的C的距離。
    	// 由於有可能左邊並不存在字符C,所以要先設pos爲一個值,
    	// 使得res[i]先取到一個大到不可能正確的值,後面一輪遍歷的時候再更新成正確的值
    	int pos = -S.length();
        for (int i = 0; i < S.length(); i++) {
            if (S.charAt(i) == C) {
                pos = i;
            }
            res[i] = i - pos;
        }
    
    	// 接下來從右向左遍歷,並計算每個字符與其最近的左邊的C的距離。
        pos = S.length() * 2 - 1;
        for (int i = S.length() - 1; i >= 0; i--) {
            if (S.charAt(i) == C) {
                pos = i;
            }
            res[i] = Math.min(res[i], pos - i);
        }
        
        return res;
    }
}

時間複雜度O(n)O(n),空間O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章