1. 程式人生 > >leetcode 821. 字元的最短距離(Shortest Distance to a Character)

leetcode 821. 字元的最短距離(Shortest Distance to a Character)

給定一個字串 S 和一個字元 C。返回一個代表字串 S 中每個字元到字串 S 中的字元 C 的最短距離的陣列。

示例 1:

輸入: S = "loveleetcode", C = 'e'
輸出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]

說明:

  1. 字串 S 的長度範圍為 [1, 10000]
  2. C 是一個單字元,且保證是字串 S 裡的字元。
  3. S 和 C 中的所有字母均為小寫字母。

暴力解決 j,k 通過 j-- k++來查詢最近的C

class Solution {
    public int[] shortestToChar(String S, char C) {
        int[] ans = new int[S.length()];
        for(int i=0;i<S.length();i++) {
        	int j=i,k=i;
        	boolean flag1= false,flag2 = false;
        	while(j>=0) {
        		if(S.charAt(j)==C) {
        			flag1=true;
        			break;
        		}
        		j--;
        	}
        	while(k<S.length()) {
        		if(S.charAt(k)==C) {
        			flag2=true;
        			break;
        		}
        		k++;
        	}
        	if(!flag1)
        		ans[i]=Math.abs(k-i);
        	else if(!flag2)
        		ans[i]=Math.abs(j-i);
        	else
        		ans[i]=Math.min(Math.abs(j-i),Math.abs(k-i));
        }
        
        return ans;    
    }
}

beat 100%

class Solution {
    public int[] shortestToChar(String S, char C) {
        int[] res = new int[S.length()];

        int last = Integer.MAX_VALUE;
        int next = S.indexOf(C);
        int current = 0;
        int diff;
        while (current < S.length())
        {
            diff = Math.min(Math.abs(current - last), Math.abs(next - current));
            res[current] = diff;
            if(current == next)
            {
                last = next;
                next = S.indexOf(C,current + 1);
                if(next == -1)
                {
                    next = Integer.MAX_VALUE;
                }
            }
            current++;

        }

        return res;
    }
}

leetcode外網的大佬總結

說明 初始結果陣列。 在字串上迴圈兩次S。 第一個向前傳球找到左邊最短的角色。 第二次向後傳球,找到右邊最短的角色。

注意 在python解決方案中,我合併了這兩個for語句。 我可以通過以下方式在C ++ / Java中執行相同的操作:

for (int i = 0; i >= 0; res[n-1] == n ? ++i : --i)

但它會變得不那麼可讀。

時間複雜度 O(N)

C ++

    vector<int> shortestToChar(string S, char C) {
        int n = S.size();
        vector<int> res(n, n);
        int pos = -n;
        for (int i = 0; i < n; ++i) {
            if (S[i] == C) pos = i;
            res[i] = min(res[i], abs(i - pos));
        }
        for (int i = n - 1; i >= 0; --i) {
            if (S[i] == C)  pos = i;
            res[i] = min(res[i], abs(i - pos));
        }
        return res;
    }

Java的

    public int[] shortestToChar(String S, char C) {
        int n = S.length();
        int[] res = new int[n];
        int pos = -n;
        for (int i = 0; i < n; ++i) {
            if (S.charAt(i) == C) pos = i;
            res[i] = i - pos;
        }
        for (int i = n - 1; i >= 0; --i) {
            if (S.charAt(i) == C)  pos = i;
            res[i] = Math.min(res[i], Math.abs(i - pos));
        }
        return res;
    }

蟒蛇

 def shortestToChar(self, S, C):
        n = len(S)
        res = [n] * n
        pos = -n
        for i in range(n) + range(n)[::-1]:
            if S[i] == C: pos = i
            res[i] = min(res[i], abs(i - pos))
        return res

另一個想法非常相似。 我們首先給它一個迴圈來找到所有字元C並將距離初始化為0.  同樣,我們可以將額外的傳遞合併到前傳傳遞,例如:

for (int i = 0; i < n; ++i) if (S[i] == C) res[i] = 0; else if (i > 0) res[i] = res[i - 1] + 1;

但它會變得不那麼可讀。

C ++:

    vector<int> shortestToChar(string S, char C) {
        int n = S.size();
        vector<int> res(n, n);
        for (int i = 0; i < n; ++i) if (S[i] == C) res[i] = 0;
        for (int i = 1; i < n; ++i) res[i] = min(res[i], res[i - 1] + 1);
        for (int i = n - 2; i >= 0; --i) res[i] = min(res[i], res[i + 1] + 1);
        return res;
    }

Java的:

    public int[] shortestToChar(String S, char C) {
        int n = S.length();
        int[] res = new int[n];
        for (int i = 0; i < n; ++i) res[i] = S.charAt(i) == C ? 0 : n;
        for (int i = 1; i < n; ++i) res[i] = Math.min(res[i], res[i - 1] + 1);
        for (int i = n - 2; i >= 0; --i) res[i] = Math.min(res[i], res[i + 1] + 1);
        return res;
    }

蟒蛇:

    def shortestToChar(self, S, C):
        n = len(S)
        res = [0 if c == C else n for c in S]
        for i in range(n - 1): res[i + 1] = min(res[i + 1], res[i] + 1)
        for i in range(n - 1)[::-1]: res[i] = min(res[i], res[i + 1] + 1)
        return res