Algorithm string1中的最小长度窗口,其中string2是子序列
给出了主DNA序列(一个字符串)(比如string1)和另一个要搜索的字符串(比如string2)。您必须在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
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())
打破
}
}
}
如果不是代码,您是否至少应该解释一下您的方法。