首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用哪种算法将字符串序列排序成块,避免以某个元素开头?

使用哪种算法将字符串序列排序成块,避免以某个元素开头?
EN

Stack Overflow用户
提问于 2019-09-03 04:28:52
回答 1查看 83关注 0票数 2

假设有一个列表:['a', 'a', 'a', 'b', 'a', 'a', 'b', 'b', 'b']

您可以使用哪种算法将其分类为具有2-4个元素的组?以'b'开头的组应该尽可能少。

在本例中:aa | aba | abbb

这是一个家庭作业,找到一个最优的算法。

EN

回答 1

Stack Overflow用户

发布于 2019-09-03 09:16:18

如果允许我们更改元素的顺序,那么问题就很简单了:只要对所有的a进行分组,并尽可能在每个b后面插入三个a,就可以创建大小为4的组(如果没有足够的b,则创建更小的组)。在此之后,如果还有剩余的b,请将它们分组为大小为4的组;否则,可以根据需要对其余的a进行分组。

如果我们必须保持元素的顺序,问题就会变得更有趣,我们可以在O(n)中解决这个问题,其中n是元素的数量,使用以下递归:让f(i, j)表示从b开始直到索引i的最优集合中的组数,其中这个元素是它的组中的第j个元素。(由于j的范围从2到4,因此复杂度为O(3n) = O(n)。)然后:

代码语言:javascript
运行
复制
f(i, j) =
  if A[i - j + 1] == 'b':
    return 1 + min(f(i - j, k)), for 1 < k < 5
  else:
    return min(f(i - j, k)), for 1 < k < 5

JavaScript中简单的自上而下:

代码语言:javascript
运行
复制
function f(A, i, j){
  if (j > i + 1 || i == 0)
    return Infinity
  if (i == 1)
    return A[0] == 'b' ? 1 : 0

  let prev = Infinity
  
  for (let k=2; k<5; k++)
    prev = Math.min(f(A, i - j, k), prev)
    
  return prev + (A[i - j + 1] == 'b' ? 1 : 0)
}

var A = "aaabaabbb"
console.log(A)
for (let j=2; j<5; j++)
  console.log(`If the last char is ${j + [,,'nd','rd','th'][j]}, then optimal is ${f(A, A.length-1, j)}`)

A = "aaabaabbbb"
console.log('\n' + A)
for (let j=2; j<5; j++)
  console.log(`If the last char is ${j + [,,'nd','rd','th'][j]}, then optimal is ${f(A, A.length-1, j)}`)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57762393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档