chapter-four/0800~0899/0821.Shortest-Distance-to-a-Character
821. Shortest Distance to a Character
题目
Given a string s and a character c that occurs in s, return an array of integers answer where answer.length == s.length and answer[i] is the shortest distance from s[i] to the character c in s.
Example 1:
Input: s = "loveleetcode", c = "e"
Output: [3,2,1,0,1,0,0,1,2,2,1,0]
Example 2:
Input: s = "aaab", c = "b"
Output: [3,2,1,0]
Constraints:
1 <= s.length <= 104s[i]andcare lowercase English letters.coccurs at least once ins.
题目大意
给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。
解题思路
- 解法一:从左至右更新一遍到 C 的值距离,再从右至左更新一遍到 C 的值,取两者中的最小值。
- 解法二:依次扫描字符串 S,针对每一个非字符 C 的字符,分别往左扫一次,往右扫一次,计算出距离目标字符 C 的距离,然后取左右两个距离的最小值存入最终答案数组中。
代码
package leetcode import ( "math" ) // 解法一 func shortestToChar(s string, c byte) []int { n := len(s) res := make([]int, n) for i := range res { res[i] = n } for i := 0; i < n; i++ { if s[i] == c { res[i] = 0 } else if i > 0 { res[i] = res[i-1] + 1 } } for i := n - 1; i >= 0; i-- { if i < n-1 && res[i+1]+1 < res[i] { res[i] = res[i+1] + 1 } } return res } // 解法二 func shortestToChar1(s string, c byte) []int { res := make([]int, len(s)) for i := 0; i < len(s); i++ { if s[i] == c { res[i] = 0 } else { left, right := math.MaxInt32, math.MaxInt32 for j := i + 1; j < len(s); j++ { if s[j] == c { right = j - i break } } for k := i - 1; k >= 0; k-- { if s[k] == c { left = i - k break } } res[i] = min(left, right) } } return res } func min(a, b int) int { if a > b { return b } return a }