我想写一个函数,其中输入是一个字符串(例如ACGTTGCATGTCGCATGATGCATGAGAGCT)和一个整数(例如4)。该函数应该能够识别具有在输入字符串中最常重复的整数长度的子字符串。我想我应该使用reDim,虽然我已经研究了它应该如何工作,但我无法弄清楚正确的语法。
代码挑战:解决频繁的单词问题。输入:一个字符串 文字和整数k。输出:文本中所有最常见的k-mers。
Function BIOINFO2(txt As String, k As Integer)
Dim FrequentPatterns As String
Dim ptrn As String
Dim n() As Integer
Dim i As Integer
Dim s As Integer
Dim j As Integer
Dim maxCount As Integer
For s = 1 To Len(txt) - k + 1
ptrn = Mid(txt, s, k)
For i = 1 To Len(txt) - Len(ptrn) + 1
If Mid(txt, i, Len(ptrn)) = ptrn Then
ReDim n(i)
n(i) = 0
n(i) = n(i) + 1
End If
Next i
maxCount = Application.Max(n(i))
For j = 1 To Len(txt) - k + 1
If n(i) = maxCount Then
FrequentPatterns = FrequentPatterns + " " + Mid(txt, s, k)
End If
Next j
Next s
BIOINFO2 = FrequentPatterns
End Function
答案 0 :(得分:1)
这只是为了澄清ReDim
问题,而不是代码的逻辑。
使用ReDim
调整数组大小(丢失存储在其中的值),ReDim Preserve
调整数组大小,同时保留数值。
如果您事先知道所需数组的大小,则应在开始时使用正确的大小进行分配,如
Dim arr(1 To m) As Long
如果您不知道所需的尺寸,可以稍后再像这样调整
Dim arr() As Long
'Do stuff and find out you need the array to hold m elements
ReDim Preserve arr(1 To m)
你的情况介于两者之间,因为你知道函数开头的大小,但它不是一个恒定的大小。你可以Dim
一个具有特定大小的数组,只有它是常量的,所以在这种情况下你需要先声明它而不是边界,然后ReDim
正确的大小。
Dim arr() as Long
ReDim arr(1 To m) As Long
Redim arr(m)
与Redim arr(base To m)
相同,其中base
为0或1.默认值为0,但您可以在Option Base 1
开头设置它模块。
您可以使用UBound
和LBound
函数找出最高和最低的数组索引,因此循环遍历所有值的循环可能如下所示
For i = LBound(arr) To UBound(arr)
'Do something
Next i
这样可以避免不同基础的问题。
通常最好尽可能少地调整数组大小。在最坏的情况下,系统必须将整个阵列复制到内存中有足够可用空间的另一个位置。
答案 1 :(得分:1)
只是为了表明这样的任务不需要VBA: (A1是你的字符串,A2是长度)
=MID(A1,MATCH(MIN(LEN(SUBSTITUTE(A1,MID(A1,ROW(A1:INDEX(A:A,LEN(A1)-A2+1)),A2),""))),LEN(SUBSTITUTE(A1,MID(A1,ROW(A1:INDEX(A:A,LEN(A1)-A2+1)),A2),"")),0),A2)
这是一个数组公式,必须用 ctrl + shift + 输入确认!
至少要获得第一个可能的解决方案。