思路
将绿宝石记为1,红宝石记为-1,求前缀和sum
对于i<j
若sum[i] === sum[j],则i···j为一个目标串。
数据量只有1e6,所以用一个最简单的hash记录sumi的下标。在求前缀和的过程中更新下标的值,做差取max即为答案。
const fs = require('fs')
const data = fs.readFileSync('/dev/stdin')
const str = data.toString('ascii').trim()
const maxn = 1000005
// let str = 'GGRRGR'
let trans = []
Array.prototype.forEach.call(str,(cur, index) => {
if(cur === 'G') {
trans.push(1)
} else {
trans.push(-1)
}
})
let ans = 0
let sum = []
sum.push(0)
for(let i = 0; i < trans.length; i++) {
sum.push(sum[i] + trans[i])
}
// console.log(trans)
// console.log(sum)
let lpos = Array(maxn), rpos = Array(maxn)
sum.forEach((cur,index)=>{
if (lpos[cur] === undefined) {
lpos[cur] = index
}
rpos[cur] = index
ans = Math.max(ans, rpos[cur] - lpos[cur])
})
console.log(ans)
process.exit()