【问题标题】:Finding boundaries of multiple subsequences in a string查找字符串中多个子序列的边界
【发布时间】: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

同样,我想分别提取AD 的子字符串,忽略主字符串中的B。主字符串中每种类型可以有许多子字符串。

模型输出:

Type Boundaries
A    1,11
D    12,20
D    26,29 

如果距离大于阈值会破坏字符串,我通过查找As 之间的距离来实现一种效率低下的非算法方式。我必须为AD 分别运行它。这导致边界区域重叠。

我能有更好的方法来解决这个问题吗?

EDIT-1

合法子串可以是任意长度,但不应被大于阈值x 的其他子串污染。这意味着在搜索 A 的子字符串时,它不应包含连续大于阈值的其他字符 BD

如果x = 2 在搜索A 时,AABBAAAA, AABDAAAA 有效,但AADBDAAA, AABBBAAA 无效。同样,在搜索 D 时(AB 将成为污染源)。

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


【解决方案1】:

所以,这里有一些针对您的问题的建议:

由于我们的字符串中只有三种类型的字符,因此很容易跟踪这些字符的最后位置。

从字符串的开头开始,跟踪当前字符到最后一个位置的距离是多少,如果大于阈值,打破它并从那里开始新的子字符串。

伪代码:

int start = 0;
int lastA = -1;
int lastD = -1;
for(int i = 0; i < input.length(); i++)
    if(input.charAt(i) == 'A'){
       if(lastA != -1 && i - lastA > x){
           create a substring from start to i - 1; 
           start = i; //Update the new start for the next substring
           lastD = -1;//Reset count for D
       }
       lastA = i;
    }else if(input.charAt(i) == 'D'){
       //Do similar to what we do for character A
    } 
}
create a substring from start to end of the string; //We need to add the last substring.

更新python代码:

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 = lastA + 1
            while(start < len(arr) and arr[start] == 'B'):
                start = start + 1
            lastD = -1 
        lastA = i
    elif(arr[i] == 'D'):
        if(lastD != -1 and i - lastD > x):
            print("D", start + 1, lastD + 1)
            start = lastD + 1
            while(start < len(arr) and arr[start] == 'B'):
                start = start + 1
            lastA = -1
        lastD = i
while(start < len(arr) and arr[start] == 'B'):
    start = start + 1 
if(start < len(arr)):   
   print("A or D", start + 1, len(arr))

【讨论】:

  • 我用的是python,也可以用perl
  • @aravindramesh 只是给你一些建议。你明白这个想法吗?是帮助还是您需要其他帮助?
  • 我明白了,翻译成python,会贴出结果。
  • 请看Edit-2,从12开始应该有一个“D”块,但是由于i - lastD失败,所以无法进入if。
  • @aravindramesh 抱歉,我的伪代码中有一些错误。请查看this。我也更新了我的伪代码。
猜你喜欢
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2020-07-13
相关资源
最近更新 更多