算法设计与分析: 3-14 正则表达式匹配问题

【总结】《算法设计与分析》第三章动态规划 第 3章  动态规划 习题总结 算法实现题 3-0 独立任务最优调度问题  {} 算法实现题 3-1 最少硬币问题  {} 算法实现题 3-2 序关系计数问题  {} 算法实现题 3-3 多重幂计数问题  {} 算法实现题 3-4 编辑距离问题  {} 算法 阅读详情

3-14 正则表达式匹配问题


问题描述

许多操作系统采用正则表达式实现文件匹配功能。一种简单的正则表达式由英文字母、数字及通配符“ * ”和“?”组成。“?”代表任意一个字符。“ * ”则可以代表任意多个字符。 现要用正则表达式对部分文件进行操作。

试设计一个算法,找出一个正则表达式,使其能匹配的待操作文件最多,但不能匹配任何不进行操作的文件。所找出的正则表达式的长度还应是最短的。

数据输入:
输入由 n(1≤n≤250)行组成。每行给出一个文件名。文件名由英文字母和数字组成。英文字符要区分大小写,文件名长度不超过 8 个字符。 文件名后是一个空格符和一个字符“+”或“-”。“+”表示要对该行给出的文件进行操作, “-”表示不进行操作。


Java

import java.util.Scanner;

class Cha{
    char c;  //字符
    int f;   //字符出现的频率
}

public class ZhengZeBiaoDaShiPiPei {

    /*
    正则表达式可选字符集的排列顺序先为‘*’,‘?’,操作文件名序列中出现的所有字符按其频率递减的次序随后
    大体思路:
    正则表达式为s,当前考察文件为f
    match(i, j)为s[1,i]与f[1,j]匹配情况
    如果match(i-1, j-1) = 1, s[i] = '?'
        match(i-1, j-1) = 1, s[i] = f[j]
        match(i-1, k) = 1,   s[i] = '*'
    match(i, j) = 1
    否则 match(i, j) = 0
    */

    private static int MAXN = 250;  //文件数
//    private static int MAXL = 8;  //文件名长度
    private static int MAXP = 62; //大写字母 + 小写字母 + 数字
    private static int minlen;  //最优正则表达式长度
    private static int maxmat;  //最优正则表达式所能匹配的操作文件数
    private static int curmat;  //当前正则式所能匹配的操作文件数
    private static String[] f = new String[MAXN+1];  //操作文件 + 非操作文件
    private static String[] k = new String[MAXN+1];  //非操作文件
    private static int[] n = new int[2];  //n[0]为操作文件数,n[1]为非操作文件数
    private static int[] p = new int[MAXP];  //p[len-1] 存储 s[len]可选字符数
    private static char[] s = new char[MAXP];  //存储临时正则表达式
    private static char[] minmat = new char[MAXP];  //最优正则表达式
    private static int[][][] match = new int[MAXP][MAXN+1][MAXP];  //match[len][i][j]表示正则表达式的第len个字符与第i个文件的第j个字符的匹配情况

    private static Cha[][] cha = new Cha[MAXN][MAXP]; //cha[len][i]表示正则表达式长度为len时的字符排序情况

    public static void main(String[] args){
        readin();
        search(0);
        out();
    }

    private static void readin(){
        Scanner input = new Scanner(System.in);

        n[0] = 0;
        n[1] = 0;
        p[0] = 0;
        String str;
        String ch;
        for(int i=0; i<MAXN; i++)
            for(int j=0; j<MAXP; j++)
                cha[i][j] = new Cha();
        while(input.hasNext()){
            str = input.next();
            ch = input.next();

            if(ch.equals("+")){
                f[++n[0]] = str;
                save(f[n[0]].charAt(0), 0);
            }
            else{
                k[++n[1]] = str;
            }
        }
        for(int i=1; i<=n[1]; i++)
            f[n[0]+i] = k[i];

        for(int i=1; i<=n[0]+n[1]; i++)
            match[0][i][0] = 1;
        maxmat = 0;
        minlen = 255;
    }

    //对操作文件名中出现的字符按出现频率排序存储,以加快搜索进程
    private static void save(char c, int len){
        int i, j;
        for(i=1; i<=p[len]; i++)
            if(cha[len][i].c == c){
                cha[len][i].f++;
                cha[len][0] = cha[len][i];
                j = i;
                while(cha[len][j-1].f < cha[len][0].f){  //将频率小于当前字符频率的字母后移
                    cha[len][j] = cha[len][j-1];
                    j--;
                }
                cha[len][j] = cha[len][0];  //将当前字母放到适当位置
                return;
            }
        //如果p[len] = 0,或者字符c第一次出现,则增加一个字符
        cha[len][++p[len]].c = c;
        cha[len][p[len]].f = 1;
    }

    //计算当前匹配情况
    private static boolean check(int len){
        int i, j, t, k = 0;
        curmat = 0;
        for(i=1; i<=n[0]; i++){  //操作文件数
            for(j=0; j<MAXP; j++)
                match[len][i][j] = 0;
            if(len==1 && s[1]=='*')
                match[len][i][0] = 1;
            for(j=1; j<=f[i].length(); j++){  //操作文件的每个字符
                switch(s[len]){
                    case '*':
                        for(t=0; t<=j; t++)
                            if(match[len-1][i][t]==1){
                                match[len][i][j] = 1; //正则表达式的第len个字符与第i个文件的第j个字符的匹配情况
                                break;
                            }
                        break;
                    case '?':
                        match[len][i][j] = match[len-1][i][j-1];
                        break;
                    default:
                        if(s[len]==f[i].charAt(j-1))
                            match[len][i][j] = match[len-1][i][j-1];
                        break;
                }
            }
            for(j=f[i].length(); j>=1; j--){
                if(match[len][i][j] == 1){
                    k++;
                    if(j == f[i].length()) //第i个文件与正则表达式匹配
                        curmat++;
                    break;
                }
            }
        }
        if(k<maxmat || k==maxmat && len>=minlen)
            return false;
        p[len] = 0;
        for(i=1; i<=n[0]; i++) //对与正则表达式匹配的文件中的字符重新排序,以便正则式下次扩展
            for(j=1; j<f[i].length(); j++)
                if(match[len][i][j]==1)
                    save(f[i].charAt(j), len);
        return true;
    }

    //判断是否匹配非操作文件
    private static boolean ok(int len){
        int i, j, l, t;
        for(l=1; l<=len; l++){
            for(i=n[0]+1; i<=n[0]+n[1]; i++){
                for(j=0; j<MAXP; j++)
                    match[l][i][j] = 0;
                if(s[1]=='*' && l==1)
                    match[l][i][0] = 1;
                for(j=1; j<=f[i].length(); j++){
                    switch(s[l]){
                        case '*':
                            for(t=0; t<=j; t++)
                                if(match[l-1][i][t]==1){
                                    match[l][i][j] = 1;
                                    break;
                                }
                            break;
                        case '?':
                            match[l][i][j] = match[l-1][i][j-1];
                            break;
                        default:
                            if(s[l]==f[i].charAt(j-1))
                                match[l][i][j] = match[l-1][i][j-1];
                            break;
                    }
                }
            }
        }
        for(i=n[0]+1; i<=n[0]+n[1]; i++)  //如果正则表达式与非操作文件匹配
            if(match[len][i][f[i].length()]==1)
                return false;
        return true;
    }

    //求最优匹配的回溯法
    //len 为当前正则表达式长度
    //正则表达式可选字符集的排列顺序先为‘*’,‘?’,操作文件名序列中出现的所有字符按其频率递减的次序随后
    private static void search(int len){
        if((curmat>maxmat || (curmat==maxmat && len<minlen)) && ok(len)){
            maxmat = curmat;
            minlen = len;
            for(int i=0; i<=minlen; i++)
                minmat[i] = s[i];
        }
        len++;
        if(len==1 || s[len-1]!='*'){
            s[len] = '?';
            if(check(len))
                search(len);
            s[len] = '*';
            if(check(len))
                search(len);
        }
        for(int i=1; i<=p[len-1]; i++){
            s[len] = cha[len-1][i].c;
            if(check(len))
                search(len);
        }
    }

    private static void out(){
        System.out.println(maxmat);
        for(int i=1; i<=minlen; i++)
            System.out.print(minmat[i]);
    }
}

Input & Output

EXCHANGE +
EXTRA +
HARDWARE +
MOUSE -
NETWORK -

^D
3
*A*

Reference

王晓东《计算机算法设计与分析》(第3版)P93-94
https://blog.youkuaiyun.com/u012319493/article/details/49976897

CRA匹配实战:镜头与Sensor选型3度误差内规避Color Shading 本文深入探讨了摄像头模组设计中镜头与Sensor的主光线角(CRA)匹配问题,通过实测案例和选型决策流程,帮助工程师在3度误差内规避Color Shading。文章详细解析了CRA的底层逻辑、曲线特征及匹配策略,并提供了实用的供应商沟通要点和ISP调试技巧。 阅读详情

相关推荐

C++编译期正则表达式CTRE:零开销高性能字符串匹配实战

正则表达式是文本模式匹配与处理的通用技术,其核心原理是通过有限状态机解析字符串。传统运行时正则库(如std::regex)在性能敏感场景下,动态解析与状态机构建可能成为瓶颈。编译期正则表达式(Compile-Time Regex)技术通过C++模板元编程与constexpr,将模式解析与状态机生成移至编译阶段,实现零运行时开销的匹配逻辑,其技术价值在于将运行时不确定性转化为编译期确定性,从而获得极致的性能与安全性。这一技术尤其适用于网络协议解析、日志实时过滤、词法分析等高吞吐、低延迟的应用场景。本文以CTR

453

正则表达式匹配

请实现一个函数用来匹配包括’.‘和’*'的正则表达式。 模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。 例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。 样例 输入: s=“aa” p=“a*” 输出:true /* f[i][j]表示s[i...]是否可...

weixin_44356316的博客 190

Python词法分析器:从概念到实践

正则表达式(Regular Expressions),简称 Regex,是一种用于匹配字符串中字符组合的模式。在文本处理中,正则表达式是一个强大的工具,用于搜索、替换、验证或提取信息。正则表达式的组成元素包括:字符集合:如[a-z]表示任意小写字母,[0-9]表示任意数字。特殊字符:如表示任意单个字符,表示前一个字符的零次或多次出现。锚点:如表示行的开始,表示行的结束。分组:使用圆括号()来定义子表达式,便于实现复杂的匹配逻辑。

weixin_32311823的博客 1305

王晓东算法设计与分析c语言,Algorithm 计算机算法设计与分析(王晓东版)课程设计经典例子 - 下载 - 搜珍网...

程序/程序/lab 3-11/程序/lab 3-11/3-11 正则表达式匹配问题.cpp程序/lab 4-11/程序/lab 4-11/4-11 删数问题.cpp程序/lab 4-3/程序/lab 4-3/4-3 磁带最优存储问题.cpp程序/lab 4-7/程序/lab 4-7/4-7 多处最优服务次序问题.cpp程序/lab 5-11/程序/lab 5-11/5-11 重复拉丁矩阵问题.cp...

weixin_32430445的博客 309

C++代码实例:正则表达式

可以采用正则表达式来实现字符串匹配功能。一种简单的正则表达式是由英文字母(区分大小写)、数字及通配符“*”和“?”任意组合而成的。“?”代表任意一个字符,“*”代表零个或任意多个字符。例如,a*b可以匹配acb,aabb,afdfdb,ab等,但不可以匹配ac,bb,abbc;a?b可以匹配acb,abb,但不可以匹配ab,accb。试编写一个程序,从文件中读入N个字符串,再从键盘上读入任意一个合乎规则的正则表达式,例如:“a?bb*d”,输出符合正则表达式的字符串。

避开这些坑!RK3588安卓系统内置输入法的正确姿势(含.mk文件修改指南)

本文详细解析了在RK3588安卓系统定制中预置第三方输入法的完整流程与关键避坑指南。重点涵盖APK签名、Android.mk文件编写、系统默认输入法配置(使用adb ime list命令获取服务名)以及SeLinux策略适配等核心步骤,并指出RK3566/RK3568等兄弟平台的通用性与差异点,帮助开发者实现稳定、深度的系统集成。

tgb34567890的博客 437

经典算法题分享2

经典算法题目分享

weixin_56819785的博客 1410

Python实战:3步搞定DICOM转JPG/PNG(附批量处理脚本)

本文详细介绍了如何使用Python在3步内将DICOM医学影像转换为JPG/PNG格式,并提供了批量处理脚本。通过Pydicom、Pillow和NumPy库的组合,解决了像素值处理、批量转换效率和医学图像特性保留等关键问题,适合医疗AI开发者和放射科医生快速集成到工作流中。

numpy6sculptor的博客 590

动态规划法解决正则表达式模式匹配问题

采用动态规划的方法,解决正则表达式模式匹配的问题

weixin_70385060的博客 248

从交换机安全配置,看常见局域网攻击

前言 构建零信任网络,自然离不开网络准入(NAC),这就涉及到交换机的一些安全测试,于是有了此文《从交换机安全配置看常见局域网攻击》。 交换机安全配置 如本文标题所说从交换机安全配置看常见的局域网攻击,那么下面提到的各种攻击方式,自然是建立在交换机安全配置之上来说的。我们通过h3c官方提供的《H3C 交换机安全加固手册》和《安全配置指导》,从这两份手册可以看出交换机支持的安全配置非常多,基本已经覆盖了各种我们熟知局域网攻击。下面就挑几个典型的攻击方式进行演示。 arp欺骗 【一>所有资源获取&lt

kali_Ma的博客 1万+

新手必看!BUUCTF-PWN题实战:从零搭建Kali环境到成功RIP栈溢出

本文为CTF二进制安全新手提供了一份详实的BUUCTF-PWN入门指南。内容涵盖从零搭建Kali Linux环境、安装配置pwntools等核心工具,到深入浅出地讲解栈溢出原理与汇编基础,并手把手带领读者完成一道名为“rip”的经典栈溢出题目实战,成功利用漏洞获取系统权限。

t8u9v0w1x的博客 504

文件名匹配-动态规划

1.问题描述 假定正则表达式中只有如下存在:英文字母(区分大小写)、 数字、通配符“?”代表一个未知的字符,通配符“*”代表0或N个未知的字符。在某目录下的文件中寻找一个正则表达式,要求能匹配最多的文件且不能匹配任何一个不要操作的文件,在此前提下寻求长度最短的正则表达式,如果有不止一个结果则输出任意一个。本程序在视线中有如下扩展要求:(1)建立了图形界面,可以方便用户直观方便的获取结果和进行操作。

MikoLiu的博客 2282

2025浏览器指纹伪装终极指南:Playwright修改WebGL+时区+分辨率,小红书爬1000条零验证

2025年小红书的反爬已经进入“多维校验”时代,单纯修改某一个指纹维度已失效。本文方案的核心是“让所有特征都一致且合理”——WebGL+Canvas+时区+分辨率+UA+行为,形成一个完整的“真实用户画像”,让小红书的反爬系统无法区分是爬虫还是真人。这套方案不仅适用于小红书,也可迁移到知乎、抖音、跨境电商等其他高反爬平台,只需替换对应的指纹库和数据提取逻辑。记住:指纹伪装的本质不是“欺骗”,而是“模拟真实”,把每个细节都做到和人类一致,自然就能实现“零验证”爬取。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3069

剑指offer:正则表达式匹配

题目描述: 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 思路分析: 这里要注意审题,一开始看的时候以为是两个模式串的匹配。后来发现一个...

weixin_34358092的博客 154

从零构建知识图谱:本体工程与知识建模实战指南

本文是一份从零构建知识图谱的实战指南,重点阐述了知识建模与本体工程的核心地位。文章详细介绍了如何使用Protégé工具进行本体设计,包括定义领域、复用现有本体、构建类层次与属性约束,并讲解了如何利用D2RQ工具将关系数据库数据转换为RDF三元组,最终通过Apache Jena Fuseki搭建SPARQL端点进行知识查询与推理,让知识图谱真正“活”起来。

weixin_29057695的博客 568

从零到一:Python+Playwright 实现动态网站全量数据采集实战(附反爬对抗与性能优化)

在动手之前,先明确武器优势: 2. 项目结构规划 为了代码可维护性,我们采用模块化结构: 三、核心实战:构建动态采集器 第一步:初始化“隐身”浏览器 普通启动容易被检测,我们需要注入一段 JS 脚本来抹除自动化特征。 第二步:处理无限滚动与动态加载 这是动态网站的核心难点。我们需要模拟人类滚动,并等待新数据加载完成。 第三步:登录态保持与复用 避免每次运行都重新登录。我们将 Cookie 保存到本地,下次直接加载。 第四步:主流程编排 将上述模块串联起来,并加入异常重试机制。 四、进阶优化:性能与反爬

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1162

【剑指】19.正则表达式匹配

题目描述请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。算法分析当模式中的第二个字符不是“*”时:    1. 如果字符串第一个字符和模式中的第一个字符相匹...

YTea的博客 204

华为OD机试2025C卷-双十一最大花费金额[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率

双十一最大花费金额 - 动态规划解法 摘要:本文介绍了华为OD机试中"双十一最大花费金额"问题的动态规划解法。该问题要求在给定N件商品价格和优惠券面额X的情况下,选择若干商品使总花费不超过X且尽可能大。核心解法采用布尔型动态规划数组,记录每个金额是否可被拼出。算法时间复杂度为O(N*X),空间复杂度为O(X)。通过倒序遍历避免重复选择同一商品,最后从X向下查找第一个可达金额作为答案。文中提供了C++和Java的实现代码,并解释了与经典0-1背包问题的关系。 关键点: 问题本质是0-1背包/子集和问题的变体

2503_91057718的博客 46

HarmonyOS ArkTS密码强度检测深度解析:正则表达式实时分析、多维度评分算法与可视化反馈

如果检测逻辑非常复杂(如调用远程 API 检查密码是否在泄露数据库中),就需要"防抖"(debounce)处理。触发完整的 UI 重建,听起来很浪费,但实际上这个开销极低——密码字符串通常很短(<50 字符),5 个正则检测每个都是微秒级的操作。——如果说密码生成器是"创造密码",那么密码强度检测就是"验证密码"。密码强度检测的基石是正则表达式。(actionable feedback),不仅告诉用户"不够强",还告诉"哪里不够强"。未满足的项标红/灰色,告诉用户"还缺什么才能变强"——这是一种。

2403_87838053的博客 264

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

正则表达式

本文整理了开发中常用的正则表达式,包括匹配中文、英文字母、数字、邮箱、手机号、身份证、URL等基本验证规则,同时提供了用户名、密码、IP地址等特殊格式的校验方法。这些表达式可用于表单验证、数据筛选等场景,如限制输入长度(4-10个字符)、禁止特殊符号开头/结尾等,涵盖了大部分开发需求。此外,还包含HTML标记、空白行、双字节字符等特殊字符的匹配规则,以及数字范围、浮点数等数值类型的精确校验。

人工智能全栈工程师 | 智能算法研发与实战落地​专注于人工智能算法研究、代码实现与工程落地,提供从模型设计到部署应用的全流程解决方案。 731

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SecGPT-14B:基于大语言模型的恶意PowerShell脚本智能分析与去混淆

在网络安全领域,恶意脚本分析是威胁检测与响应的核心环节。传统方法主要依赖静态签名匹配和基于行为的沙箱分析,但面对日益复杂的代码混淆技术,其效果往往受限。大语言模型(LLM)凭借其强大的语义理解和上下文推理能力,为这一领域带来了范式转变。通过在海量代码和安全知识上进行预训练与精调,模型能够深入理解脚本的底层逻辑与行为意图,实现从“形似”到“神似”的跨越。这种技术不仅能自动化完成繁琐的代码去混淆工作,还能将离散的操作关联成连贯的攻击链,并抽象出高层次的攻击意图,直接映射到ATT&CK等威胁框架。其核心价值在于将

weixin_30460489的博客 329

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

PCredz高级正则表达式技巧:精准匹配敏感数据模式

PCredz是一款强大的敏感数据提取工具,能够从pcap文件或实时网络接口中精准识别信用卡号、NTLM、Kerberos、HTTP Basic等多种敏感信息。掌握其正则表达式匹配技巧,能显著提升数据提取效率与准确性,让敏感信息检测工作事半功倍。 ## 核心敏感数据正则匹配规则解析 ### 信用卡号匹配:兼顾格式与校验位验证 PCredz采用多重验证机制识别信用卡号,不仅匹配常见的13-16位数

gitblog_00588的博客 304

剑指offer面试题:正则表达式匹配

转载自:http://www.cnblogs.com/AndyJee/p/4700373.html 题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"

u014609111的博客 312

蓝桥杯正则表达式实战:核心语法与竞赛技巧

正则表达式作为字符串处理的强大工具,通过特定语法规则实现高效的模式匹配与文本处理。其核心原理基于有限状态自动机,通过元字符组合描述复杂匹配规则,在数据验证、信息提取等场景具有不可替代的技术价值。在算法竞赛领域,正则表达式常应用于蓝桥杯等编程比赛的字符串处理题目,涉及手机号验证、模式提取等典型场景。本文以蓝桥杯真题为例,深入解析\d、\w等关键元字符的使用技巧,并分享非贪婪匹配、分组回溯等高级功能在竞赛中的实战应用。针对Java语言特有的\转义问题和Pattern预编译优化等工程实践要点也进行了详细说明,帮助

weixin_34318326的博客 5602

【数据结构与算法(十四)】

代码的可重用性——解耦 正则表达式的实现

OldBowl 345

3种机制解析Navicat试用重置:macOS环境下的技术实现与设计哲学

在数据库管理工具的生态中,Navicat Premium以其强大的多数据库支持能力成为开发者的重要生产力工具。然而14天的试用期限制与长期学习、项目开发需求之间的矛盾,催生了对试用管理方案的探索需求。本文将从技术架构、实现机制和设计哲学三个维度,深度解析Navicat重置工具的技术实现,揭示其背后的系统级思考。 ## 为什么传统试用管理方案面临挑战? 在深入技术实现之前,我们需要理解Navic

gitblog_00132的博客 362
上一篇: 算法设计与分析: 3-13 最大长方体问题
下一篇: 算法设计与分析: 3-15 双调旅行售货员问题
d3y1
博客等级 码龄12年 1438粉丝 2772原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值