每日一题 --- 2055. 蜡烛之间的盘子[力扣][Go]

题目:
给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 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
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值