leetcode 821. 字元的最短距離(Shortest Distance to a Character)
阿新 • • 發佈:2018-12-19
給定一個字串 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
中的所有字母均為小寫字母。
暴力解決 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