经典算法设计:动态规划(2)字符串匹配
来源:互联网 发布:怎么装修手机版淘宝 编辑:程序博客网 时间:2024/05/18 01:42
1字符串匹配问题
在一篇英文文章中查找指定人名,人名使用26个字母(可以是大写也可是小写),空格及两个通配符(*或?),通配符*表示零个或多个任意字母,通配符?表示一个任意字母,如J*Smi??可以匹配John Smith.
分析:从开始到结尾,到第n+1个字符是否匹配成功取决于到第n个字符是否匹配成功和第n+1个字符能否匹配,也就是收益只取决于当前的状态和下一个决策量,满足无后效性,因此可用动态规划算法。
(1)用矩阵dp来描述匹配的状态,纵轴代表含有通配符的字符串S2,横轴代表要匹配的字符串S1,dp[i][j]表示s2的前i个字符能与S1的前j个字符匹配情况,若为true则表示匹配成功,否则匹配失败。
(2)设置初值,增加一行一列表示初值,dp[0][0]=ture,dp[0][i](i>0)表示S1还未被匹配,因此dp[0][i]=false(i>0);d[i][0]=d[i-1][0]&&(S[i]==‘*’)
当终止状态为true时表示匹配成功,为false表示匹配失败
(3)收益表示(递推式)
情况一:S1含有通配符,S2不含有通配符
若S2当前为*:dp[i][j]=dp[i-1][j]||dp[i][j-1]
若S2当前为非*:dp[i][j]=dp[i-1][j-1]&&(S2[i]==S1[j]||S2[i]==’?’)
java代码如下:
import java.io.*;class strMatching{private static boolean strMatching(String s1,String s2){boolean[][] dp=new boolean[s1.length()+1][s2.length()+1];dp[0][0]=true;for(int i=1;i<=s2.length();i++)dp[0][i]=false;for(int i=1;i<=s1.length();i++){char s1_char=s1.charAt(i-1);dp[i][0]=dp[i-1][0]&&(s1_char=='*'); for(int j=1;j<=s2.length();j++){if(s1.charAt(i-1)=='*')dp[i][j]=dp[i-1][j]||dp[i][j-1];else{dp[i][j]=dp[i-1][j-1]&&(s1.charAt(i-1)==s2.charAt(j-1)||s1.charAt(i-1)=='?');}} } return dp[s1.length()][s2.length()];}public static void main(String[] args){String s1="a*c",s2="abc";System.out.println(strMatching(s1,s2));}}
情况二S1与S2都含有通配符
若S1或S2当前为*:dp[i][j]=dp[i-1][j]||dp[i][j-1]
否则:dp[i][j]=dp[i-1][j-1]&&(S1[i]==’?’||S2[j]==’?’||S1[j]||S2[i]==S1[j])
- 经典算法设计:动态规划(2)字符串匹配
- 经典算法设计:动态规划(1)
- 字符串匹配经典算法
- 带通配符的字符串匹配问题的动态规划算法
- 【算法设计】动态规划
- 经典算法之-----动态规划
- 动态规划算法经典案例
- 算法:动态规划经典题目
- 动态规划算法经典案例
- 字符串匹配经典算法讲解
- 动态规划和字符串匹配(KMP、AC自动机)
- 动态规划 | 带有通配符的字符串匹配(浅显易懂)
- 动态规划 | 带有通配符的字符串匹配(浅显易懂)
- 动态规划(算法分析与设计)
- 经典算法题04-动态规划算法(背包问题)
- 五大经典算法(二)动态规划算法
- 字符串匹配的基本算法以及动态规划算法简析
- 经典算法之暴力匹配算法(字符串)
- nginx+php-fpm访问报错,显示access denied
- Android逆向反编译之工具介绍
- [LeetCode]#6 ZigZag Conversion
- APUE学习笔记(第九章)
- Jmeter-java请求执行报错:java.lang.NoSuchFieldError: INSTANCE
- 经典算法设计:动态规划(2)字符串匹配
- 利用gdb定位段错误(Segmentation fault)
- 单源最短路径问题之Dijkstra算法详解
- 函数指针数组
- HDU2825 Wireless Password AC自动机+状压DP
- Java web开发编码设置
- Ubuntu下Oracle JDK的一般安装及环境配置
- Java Swing:Nim游戏实现
- Android studio 如何导入Eclipse项目