题目:
给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符串 s ,它只包含字符 ‘’ 和 ‘|’ ,其中 '’ 表示一个 盘子 ,’|’ 表示一支 蜡烛 。
同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [lefti, righti] 表示 子字符串 s[lefti…righti] (包含左右端点的字符)。对于每个查询,你需要找到 子字符串中 在 两支蜡烛之间 的盘子的 数目 。如果一个盘子在 子字符串中 左边和右边 都 至少有一支蜡烛,那么这个盘子满足在 两支蜡烛之间 。
比方说,s = “|||||" ,查询 [3, 8] ,表示的是子字符串 "||**|” 。子字符串中在两支蜡烛之间的盘子数目为 2 ,子字符串中右边两个盘子在它们左边和右边 都 至少有一支蜡烛。
请你返回一个整数数组 answer ,其中 answer[i] 是第 i 个查询的答案。
解题代码:
// 官方题解
func platesBetweenCandles(s string, queries [][]int) []int {
n := len(s)
// 记录下标i前已有'*'的个数和在i前最近的'|'的下标
preSum := make([]int, n)
left := make([]int, n)
sum, l := 0, -1
for i, ch := range s {
if ch == '*' {
sum++
} else {
l = i
}
preSum[i] = sum
left[i] = l
}
// 记录下标i后最近的'|'的下标
right := make([]int, n)
for i, r := n-1, -1; i >= 0; i-- {
if s[i] == '|' {
r = i
}
right[i] = r
}
// 记录答案
ans := make([]int, len(queries))
for i, q := range queries {
x, y := right[q[0]], left[q[1]]
// 特别是值为-1的,说明左侧或右侧不存在'|'
if x >= 0 && y >= 0 && x < y {
ans[i] = preSum[y] - preSum[x]
}
}
return ans
}
自己写的,超出时间限制
//超出时间限制
func platesBetweenCandles(s string, queries [][]int) []int {
var ans []int
var sm = make(map[int]string)
// 记录子字串
for i, query := range queries {
sm[i] = s[query[0]:query[1] + 1]
}
// 记录状态
for i := 0; i < len(sm); i++ {
pIndex := strings.Index(sm[i],"|")
aIndex := pIndex + strings.Index(sm[i][pIndex + 1:],"|") + 1
m := 0
for aIndex > pIndex {
m += aIndex - pIndex - 1
pIndex = aIndex
aIndex += strings.Index(sm[i][aIndex + 1:],"|") + 1
}
ans = append(ans, m)
}
return ans
}