algorithm - 搜索满足特定条件的所有区间

标签 algorithm intervals pascal lazarus

如何搜索 0 数组中的所有区间小号,1 s 和 2包含相同数量的 1 的 s s 和 2是吗?

例子:

[0,1,1,2,2]

将返回 3 个间隔

[0,1,1,2,2] [1,1,2,2] [1,2]

我不想暴力破解它。是否有任何非常简单的算法可用于此类情况?我需要一些灵活的东西。

最佳答案

首先,为了算法的清晰度,我将把数字更改为字母:Z、A、B。输入现在可以表示为一个简单的字符串:“ZAABB”。同样为了清楚起见,我将在每个位置插入一个句点作为间距:“.Z.A.A.B.B.”。

这是一个符号平衡问题,很容易处理。遍历数组,跟踪每个位置的多余部分。 Z 不会改变计数; A 递增; B 递减。这给了我们

"00011221100".  

现在,提取交替计数,每个“间隔”处的计数,句点:

".Z.A.A.B.B."
"0 0 1 2 1 0"

从这里,很容易找到匹配的计数。 每一对 匹配计数都会为您提供具有相同数量的 AB 的子字符串的索引。你有三对 0 匹配和一对 1 匹配,产生子串

"0 0 1 2 1 0"Z

"0 0 1 2 1 0"Z A A B B

“0 0 1 2 1 0” A A B B

"0 0 1 2 1 0"A B

是否足够清晰,您可以实现?

关于algorithm - 搜索满足特定条件的所有区间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54137679/

相关文章:

c - 按位运算符 : Printing the numbers 1 to 100 using bit manipulation

algorithm - 用于加权有向图的 Prim 算法

php - 算法:最便宜的产品包装组合

mysql - 根据仅存储在 MySQL 中的数据计算平均值

java - Delphi 中的 "Word"是否与 Java 中的 "Char"等效?

c++ - 使用 Boost::Geometry Polygon boolean/intersections 与线段属性

JavaScript - 浏览器选项卡切换间隔问题

c++ - 使用 C++ Boost 间隔容器库 (ICL) 时如何移动间隔?

c++ - 帕斯卡到 C++ : trunc

string - 什么是 Pascal 风格的字符串?