Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm string1中的最小长度窗口,其中string2是子序列_Algorithm_Window_Dynamic Programming_Dna Sequence_Subsequence - Fatal编程技术网

Algorithm string1中的最小长度窗口,其中string2是子序列

Algorithm string1中的最小长度窗口,其中string2是子序列,algorithm,window,dynamic-programming,dna-sequence,subsequence,Algorithm,Window,Dynamic Programming,Dna Sequence,Subsequence,给出了主DNA序列(一个字符串)(比如string1)和另一个要搜索的字符串(比如string2)。您必须在string1中找到最小长度窗口,其中string2是子序列。 string1=“abcdefababaef” string2=“abf” 我想到但似乎不起作用的方法: 1.使用最长公共子序列(LCS)方法并检查(LCS的长度=string2的长度)。但这将告诉我string2是否作为子序列出现在string1中,而不是最小的窗口。 2.KMP algo,但不确定如何修改它。 3.准备st

给出了主DNA序列(一个字符串)(比如string1)和另一个要搜索的字符串(比如string2)。您必须在string1中找到最小长度窗口,其中string2是子序列。
string1=“abcdefababaef”
string2=“abf”

我想到但似乎不起作用的方法:
1.使用最长公共子序列(LCS)方法并检查(LCS的长度=string2的长度)。但这将告诉我string2是否作为子序列出现在string1中,而不是最小的窗口。
2.KMP algo,但不确定如何修改它。
3.准备string1中位于string2中的{字符:字符位置}的映射。比如: {a:0,6,8,10
b:1,7,9
f:5,12}
然后是找到最小窗口并保持“abf”顺序的方法

我不确定我的思路是正确的还是完全错了。
是否有一个已知的算法,或者有人知道任何方法?请建议。

提前谢谢

您可以使用LCS结果的DP表上的递归,执行LCS并查找
String2
String1
中的所有max子序列。然后计算每个LCS的窗口长度,可以得到最小值。若分支已超过当前找到的最小窗口的大小,则还可以停止该分支

选中读取所有LCS:-

动态规划! 下面是一个C实现

#包括
#包括
使用名称空间std;
int main(){
a、b串;
cin>>a>>b;
int m=a.size(),n=b.size();
int inf=100000000;
vector>dp(n+1,vector(m+1,inf));//最小字符串a[j…k]的长度,使得b[i…]是a[j…k]的子序列
dp[n]=vector(m+1,0);//b[n..]='',因此每个i的dp[n][i]=0
对于(int i=n-1;i>=0;--i){
对于(int j=m-1;j>=0;--j){
如果(b[i]==a[j])dp[i][j]=1+dp[i+1][j+1];
else dp[i][j]=1+dp[i][j+1];
}
}
int l,r,min_len=inf;
对于(int i=0;i我在CaleCub发现了一个类似的面试问题,唯一的区别是它是整数数组而不是字符数组。我借用了一个想法,做了一些修改,如果你在阅读这个C++代码后有任何问题,请告诉我。
这里我试图做的是:
main
函数中的
for
循环用于循环给定数组的所有元素,并找到遇到子数组第一个元素的位置,一旦找到,我调用
find_subsequence
函数,递归地将给定数组的元素与ubarray同时保留元素的顺序。最后,
find_subsequence
返回位置并计算子序列的大小

请原谅我的英语,希望我能解释得更好

#include "stdafx.h"
#include "iostream"
#include "vector"
#include "set"
using namespace std;
class Solution {
public:
   int find_subsequence(vector<int> s, vector<int> c, int arrayStart, int subArrayStart) {
    if (arrayStart == s.size() || subArrayStart ==c.size()) return -1;
    if (subArrayStart==c.size()-1) return arrayStart;

    if (s[arrayStart + 1] == c[subArrayStart + 1])
        return find_subsequence(s, c, arrayStart + 1, subArrayStart + 1);
    else
        return find_subsequence(s, c, arrayStart + 1, subArrayStart);
   }
};

int main()
{
vector<int> v = { 1,5,3,5,6,7,8,5,6,8,7,8,0,7 };
vector<int> c = { 5,6,8,7 };
Solution s;
int size = INT_MAX;
int j = -1;
for (int i = 0; i <v.size(); i++) {
    if(v[i]==c[0]){
        int x = s.find_subsequence(v, c, i-1, -1);
        if (x > -1) {
            if (x - i + 1 < size) {
                size = x - i + 1;
                j = i;
            }
            if (size == c.size())
                break;
        }
    }
}
cout << size <<"  "<<j;
return 0;
}
#包括“stdafx.h”
#包括“iostream”
#包括“向量”
#包括“集合”
使用名称空间std;
类解决方案{
公众:
int find_子序列(向量s、向量c、int arrayStart、int subArrayStart){
if(arrayStart==s.size()| | subraystart==c.size())返回-1;
if(subraystart==c.size()-1)返回arrayStart;
如果(s[arrayStart+1]==c[SubrayStart+1])
返回find_子序列(s、c、arrayStart+1、SubrayStart+1);
其他的
返回find_子序列(s、c、arrayStart+1、subraystart);
}
};
int main()
{
向量v={1,5,3,5,6,7,8,5,6,8,7,8,0,7};
向量c={5,6,8,7};
溶液s;
int size=int_MAX;
int j=-1;
对于(int i=0;i-1){
如果(x-i+1<尺寸){
尺寸=x-i+1;
j=i;
}
如果(size==c.size())
打破
}
}
}

如果不是代码,您是否至少应该解释一下您的方法。