查看字符串是否嵌入在更大的字符串中

时间:2015-01-14 19:18:27

标签: string pseudocode

我使用R.看起来像这样的数据

> hits
  Views on a 51-letter DNAString subject
subject: TCAGAAACAAAACCCAAAATCAGTAAGGAGGAGAAAGAAACCTAGGGAGAA
views:
    start end width
[1]     1  10    10 [TCAGAAACAA]
[2]    14  23    10 [CCAAAATCAG]
[3]    19  28    10 [ATCAGTAAGG]
[4]    20  29    10 [TCAGTAAGGA]
[5]    21  30    10 [CAGTAAGGAG]

所以我有一个51长度的字符串叫

subject = TCAGAAACAAAACCCAAAATCAGTAAGGAGGAGAAAGAAACCTAGGGAGAA

从此subject中提取5个子字符串。你可以在上面看到它们。我想看看5个子字符串是否在我感兴趣的区域中。感兴趣的区域来自位置14 - 27

subject = TCAGAAACAAAAC |-> CCAAAATCAGTAAG <-| GAGGAGAAAGAAACCTAGGGAGAA

换句话说,我有subject字符串中的5个子字符串。在这5个字符串中,我只查找位于14 - 27字符串的subject位置之间的字符串。这是我感兴趣的区域。

第一个[1]子串[TCAGAAACAA]并不重要,因为它嵌入在开头(由坐标1 - 10给出)并且在我感兴趣的区域之外。

坐标[2]给出的第二个14 - 23字符串告诉我它完全嵌入我感兴趣的区域(同样是14 - 27)。

第三个[3]字符串由坐标19 - 28给出。这对我来说非常重要,因为大多数字符串都嵌入在我感兴趣的区域中。

第四个[4]字符串由坐标20 - 29给出。这对我来说很重要,因为除了最后一个字符之外,大部分字符串都嵌入在我感兴趣的区域中。

第五个子串的故事是相同的。

基本上,如果60%的字符串嵌入我感兴趣的区域,我想计算它。

有人可以给我一个伪代码算法吗?我一直在考虑绘制图表,但我似乎无法实现它。我在R中这样做,所以我将伪代码转换为R.此外,60%的数字是arbritrary。我必须与我的主管确认这一点,但我确信这是无关紧要的。

2 个答案:

答案 0 :(得分:0)

def substring_index(longstring, substring):
    """Return the index of the substring in longstring."""
    # Python has a built in function for this.

def is_interesting(index, length, interesting_start, interesting_end, percentage):
    """Return true if the substring is interesting."""
    interesting = 0
    uninteresting = 0
    # check if the character at each position from index to index + length
    # is in the interesting range.
    for x in range(index, index + length + 1):
        if interesting_start < x < interesting_end:
            interesting += 1
        else:
            uninteresting += 1
    # Do some math to see if interesting / (interesting + uninteresting) 
    # is bigger than percentage

使用substring_index函数查看索引是否以及位于longstring中的位置。

使用is_interesting函数根据子字符串是否有趣返回布尔值。

因此,对于第一个子字符串,您可以将其称为:

longstring = "TCAGAAACAAAACCCAAAATCAGTAAGGAGGAGAAAGAAACCTAGGGAGAA"
substring = "TCAGAAACAA"
is_interesting(substring_index(longstring, substring), len(substring), 14, 27, 0.6)

答案 1 :(得分:0)

如果我理解得很好,你需要

  1. 定义由起始位置和结束位置给出的“感兴趣区域”。
  2. 在较大字符串的感兴趣区域中查找字符串或字符串的已接受部分。
  3. 所以这就是我在javascript中所做的事情

    var fractionIsInString = function (areaOfInterest, stringToBeFound, acceptedFraction) {
        var fractionLength = Math.floor(stringToBeFound.length*acceptedFraction),
            startPosition = 0,
            endPosition = fractionLength,          
            fraction,
            keepSearching = true;
    
        do {
            fraction = stringToBeFound.substring(startPosition, endPosition);
            if (areaOfInterest.indexOf(fraction) > -1) {
                return true;
            }
            startPosition++;
            endPosition++;
            keepSearching = endPosition < stringToBeFound.length;
        } while (keepSearching);
    
        return false;
    };
    

    要打电话给你,你只需说

    fractionIsInString('CCAAAATCAGTAAG', 'TCAGAAACAA', 0.6);
    

    第一个参数是您感兴趣的区域,可以像这样获得

    subject.substring(14, 27);
    

    第二个参数是从主题中获得的第一个字符串。从0到10的那个。 第三个参数是您要查找的第二个参数的一部分。在这种情况下为60%。

    函数的工作原理是它在较大的字符串中查找字符串的分数,如果找不到分数,它会移动到字符串的下一部分,依此类推,直到找到找到的分数或者它到达字符串的末尾。