【发布时间】:2015-12-23 08:25:41
【问题描述】:
给定一个长度为n 的字符串,由A B D 字符的组合组成。
前 1:AAAABAAAADADDDDADDDBBBBBBDDDDA
Threshold of x,给定的子字符串可以包含任何其他最大长度为x的连续子字符串
Ex-2:对于 Ex-1 中的 A 子序列,AAAABAAAADA 是具有 (1,11) 边界的合法子字符串,用于阈值 x = 2。
同样,我想分别提取A 和D 的子字符串,忽略主字符串中的B。主字符串中每种类型可以有许多子字符串。
模型输出:
Type Boundaries
A 1,11
D 12,20
D 26,29
如果距离大于阈值会破坏字符串,我通过查找As 之间的距离来实现一种效率低下的非算法方式。我必须为A 和D 分别运行它。这导致边界区域重叠。
我能有更好的方法来解决这个问题吗?
EDIT-1
合法子串可以是任意长度,但不应被大于阈值x 的其他子串污染。这意味着在搜索 A 的子字符串时,它不应包含连续大于阈值的其他字符 B 或 D。
如果x = 2 在搜索A 时,AABBAAAA, AABDAAAA 有效,但AADBDAAA, AABBBAAA 无效。同样,在搜索 D 时(A 和 B 将成为污染源)。
EDIT-2使用“Pham Trung”答案实现
代码:
start = 0
lastA = -1
lastD = -1
x = 2
arr = ["A", "A", "A", "A", "B", "A", "A", "A", "A", "D", "A", "D", "D", "D", "D", "A", "D", "D", "D", "B", "B", "B", "B", "B", "B", "D", "D", "D", "D", "A"]
for i in range(0, len(arr)):
if(arr[i] == 'A'):
if(lastA != -1 and i - lastA > x):
print("A", start + 1, lastA + 1)
start = i
lastA = i
elif(arr[i] == 'D'):
if(lastD != -1 and i - lastD > x):
print("D", start + 1, lastD + 1)
start = i
lastD = i
输出:
A 1 11
D 16 19
A 26 16
代码无法在1st 子字符串之后提取子字符串。
【问题讨论】:
-
很难理解你的问题。这个问题是否意味着我们需要找到所有子字符串,其中每个字符
A(或D)之间的距离不大于阈值x? -
子串可以是任意长度,但不能被大于阈值的其他子串污染。例如:AAABBAAA 有效,但 AAABBBAAA 对于阈值 2 无效。
-
为什么?我还是看不出这里的数字 2 有什么关系?
-
因为第二个子串 AAABBBAAA 在大
A子串的中间有 3 个 B 字符。 -
那么,你的意思是每个相同字符之间的距离不大于2吗?
标签: regex string algorithm subsequence