821.字元的最短距離
阿新 • • 發佈:2021-11-23
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; } }