划分字⺟区间【贪心算法】

题目:
字符串 S 由⼩写字⺟组成。我们要把这个字符串划分为尽可能多的⽚段,同⼀字⺟最多出现在⼀个⽚段中。返回⼀
个表示每个字符串⽚段的⻓度的列表。
示例:
输⼊:S = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”, “defegde”, “hijhklij”。
每个字⺟最多出现在⼀个⽚段中。
像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的⽚段数较少。

let S = "asdfhgk;weryotpqowiezvb,znxc"
let map = new Map()
const ls=S.length
for (let i = 0; i <ls; i++) {
    const e = S[i];
    let t = map.get(e) || []
    if (t) {
        t.push(i)
    } else {
        t = []
    }
    map.set(e, t)
}
let arr = Array.from(map.values())
let temp = arr[0]
let res = []
for (let j = 1; j < arr.length; j++) {
    const l = temp.length - 1
    const aj=arr[j].length - 1
    if (arr[j][0] < temp[l] && arr[j][aj] > temp[l]) {
        temp.push(arr[j][aj])
    } else if (arr[j][0] < temp[l] && arr[j][aj] < temp[l]) {
        continue
    } else {
        res.push(temp[l])
        temp = arr[j]
    }

}

console.log(res);
//这里再对res稍做处理一下就行了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值