首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VB 字符串通配符組合生成:遞歸算法實現任意星號位置替換

     編輯:程式設計疑難解答

問題描述

輸入字符串如 "123**456",星號 * 代表 0-9 任意數字,**星號個數不固定**。需生成所有組合:12300456, 12301456, ..., 12399456 (兩個星號共 100 種)。

遞歸解法 (核心代碼)

' 模塊級變量收集結果 (或直接輸出)
Dim results As New Collection

Sub GenerateCombinations(inputStr As String)
    Set results = New Collection
    RecursiveReplace inputStr, 1
    ' 此處可遍歷 results 輸出或寫入文件
    Dim item As Variant
    For Each item In results
        Debug.Print item
    Next
End Sub

Sub RecursiveReplace(currentStr As String, startPos As Long)
    Dim starPos As Long
    starPos = InStr(startPos, currentStr, "*")
    
    If starPos = 0 Then
        ' 無星號,遞歸終點:收集結果
        results.Add currentStr
        Exit Sub
    End If
    
    ' 有星號:遍歷 0-9 替換,遞歸處理剩餘部分
    Dim i As Long
    For i = 0 To 9
        ' 替換當前星號為數字 i
        Dim newStr As String
        newStr = Left(currentStr, starPos - 1) & CStr(i) & Mid(currentStr, starPos + 1)
        ' 遞歸處理下一個位置 (starPos 之後)
        RecursiveReplace newStr, starPos + 1
    Next i
End Sub

調用示例

Private Sub Command1_Click()
    GenerateCombinations "123**456"
    ' 立即窗口輸出 100 行組合
End Sub

非遞歸迭代法 (適用於星號較多、避免棧溢出)


Sub IterativeCombinations(inputStr As String)
    Dim starCount As Long
    starCount = CountStars(inputStr) ' 統計星號數
    
    If starCount = 0 Then
        Debug.Print inputStr
        Exit Sub
    End If
    
    Dim total As Long
    total = 10 ^ starCount ' 總組合數
    
    Dim i As Long, j As Long
    Dim chars() As String
    ReDim chars(Len(inputStr))
    For i = 1 To Len(inputStr)
        chars(i) = Mid(inputStr, i, 1)
    Next
    
    Dim starPositions() As Long
    ReDim starPositions(starCount)
    Dim idx As Long
    For i = 1 To Len(inputStr)
        If chars(i) = "*" Then
            idx = idx + 1
            starPositions(idx) = i
        End If
    Next
    
    For i = 0 To total - 1
        ' 將 i 轉為 starCount 位 10 進制數 (不足左補 0)
        Dim numStr As String
        numStr = Right(String(starCount, "0") & CStr(i), starCount) ' VB6 無格式化函數,簡化邏輯
        ' 實際需自寫補零函數
        
        ' 替換星號
        For j = 1 To starCount
            chars(starPositions(j)) = Mid(numStr, j, 1)
        Next
        
        Debug.Print Join(chars, "") ' VB6 無 Join,需循環拼接字符串
    Next
End Sub

註: VB6 字符串操作函數較弱,遞歸法代碼最簡潔易懂。星號數 < 7 時遞歸深度安全;超大組合量建議直接寫入文件而非內存收集。

關鍵點總結

  • 遞歸終止條件: 字符串中無星號 (InStr = 0)。
  • 遞歸步驟: 找到第一個星號 → 循環 0-9 替換 → 遞歸處理替換後字符串的**下一個位置**。
  • 效率: 時間複雜度 O(10^N) (N=星號數),不可避免。結果輸出/寫盤是瓶頸。
  • VB6 注意: 字符串拼接用 &,Mid/Left/Right 索引從 1 開始。

總結

VB 字符串通配符組合生成,遞歸算法最簡潔: 找星號 → 替換 0-9 → 遞歸處理剩餘。代碼不足 20 行,完美解決星號個數不固定、位置任意的通用組合生成問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved