Regular Expression Matching2015年6月24日

时间:2021-12-07 07:48:42

题目:

Implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial). The function prototype should be:
bool isMatch(const char *s, const char *p) Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true

思路:看大神的总结说是递归   反正鄙人完全没思路

解法1:

 /  test cases passed.
Status: Accepted
Runtime: ms
Submitted: minutes ago
    public boolean isMatch(String s, String p) {
if (p.contains(".") || p.contains("*")) {
if (p.length() == 1 || p.charAt(1) != '*')
return comp(s, p, s.length(), 0) && isMatch(s.substring(1), p.substring(1));
for (int i = 0; i == 0 || comp(s, p, s.length(), i - 1); i++) {
if (isMatch(s.substring(i), p.substring(2)))
return true;
}
}
return s.equals(p);
} private boolean comp(String s, String p, int sLen, int i) {
return sLen > i && (p.charAt(0) == s.charAt(i) || p.charAt(0) == '.');
}

解法2:

 /  test cases passed.
Status: Accepted
Runtime: ms
Submitted: minutes ago
public class Solution {
public boolean isMatch(String s, String p) {
if (p.isEmpty()) {
return s.isEmpty();
} if (p.length() == 1 || p.charAt(1) != '*') {
if (s.isEmpty() || (p.charAt(0) != '.' && p.charAt(0) != s.charAt(0))) {
return false;
} else {
return isMatch(s.substring(1), p.substring(1));
}
} //P.length() >=2
while (!s.isEmpty() && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')) {
if (isMatch(s, p.substring(2))) {
return true;
}
s = s.substring(1);
} return isMatch(s, p.substring(2));
}
}

解法3:有穷状态自动机

regular expression is the expression of regregular language, and regregular language can be expressed by a DFA.

I notice that nothing about DFA is talked about in the discuss,so I think I should post my codes to raise this topic.

During building the DFA, there's a small trick to make the code clean.

Regular Expression Matching2015年6月24日

 /  test cases passed.
Status: Accepted
Runtime: ms
Submitted: minutes ago
public class Solution {
String input;
public boolean isMatch(String s, String p) {
input=s; //----------building DFA------------
Node start=new Node();
Node pre=start; int i=0;
while(i<p.length()){
if(i+1<p.length() && p.charAt(i+1)=='*'){
Node n1=new Node();
Node n2=new Node();
pre.addEdge(new Edge(null,n1));
pre.addEdge(new Edge(null,n2));
n1.addEdge(new Edge(p.charAt(i),n1));
n1.addEdge(new Edge(p.charAt(i),n2));
pre=n2;
i+=2;
}
else{
Node n=new Node();
pre.addEdge(new Edge(p.charAt(i),n));
pre=n;
i++;
}
}
pre.isEnd=true; //----------walking DFA------------- return walk(start,0);
} private boolean walk(Node n,int begin){
if(begin==input.length()){
if(n.isEnd) return true;
else if(n.edges.size()==0) return false;
} for(Edge e:n.edges){
if(e.take==null) {if(walk(e.to,begin)) return true;}
else if(begin<input.length() && e.take=='.') {if(walk(e.to,begin+1)) return true;}
else{
if(begin<input.length() && e.take==input.charAt(begin)) {if(walk(e.to,begin+1)) return true;}
else continue;
}
}
return false;
} //-------------below are just some datastruct to implement DFA------------- private class Node{
List<Edge> edges;
boolean isEnd; Node(){
edges=new ArrayList<Edge>();
} void addEdge(Edge e){
this.edges.add(e);
}
} private class Edge{
Character take;
Node to; Edge(Character c,Node n){
this.take=c;
this.to=n;
}
}
}

Regular Expression Matching2015年6月24日的更多相关文章

  1. SQL PASS将于8月24日在北京中医药大学举办线下活动

    活动主题:复制架构的实现和调优以及SQL Server BI在传统行业的应用 地点:北三环东路11号 北京中医药大学 白色的1号楼教学楼后楼5层511房间 时间:2013年8月24日 9:00-12: ...

  2. 2016年12月24日 星期六 --出埃及记 Exodus 21&colon;19

    2016年12月24日 星期六 --出埃及记 Exodus 21:19 the one who struck the blow will not be held responsible if the ...

  3. 2016年11月24日 星期四 --出埃及记 Exodus 20&colon;15

    2016年11月24日 星期四 --出埃及记 Exodus 20:15 "You shall not steal.不可偷盗.

  4. 2016年10月24日 星期一 --出埃及记 Exodus 19&colon;8

    2016年10月24日 星期一 --出埃及记 Exodus 19:8 The people all responded together, "We will do everything th ...

  5. 2016年6月24日 星期五 --出埃及记 Exodus 14&colon;21

    2016年6月24日 星期五 --出埃及记 Exodus 14:21 Then Moses stretched out his hand over the sea, and all that nigh ...

  6. 6月24日AppCan移动开发者大会礼品清单遭泄露

    6月24日,第一届AppCan移动开发者大会将在北京国际会议中心举办,大会以”平台之上,应用无限”为主题,全景展现移动应用发展趋势.AppCan 移动技术蓝图及80万开发者的技术实践成果. 大会现场礼 ...

  7. 2018年3月24日上海MVP线下技术交流活动简报

    2018年3月24日下午,几位上海MVP自发组织了一次线下的技术交流会,主要由MVP胡浩牵头,我(陈晴阳).刘鑫.朱兴亮和胡浩各自做了一次主题演讲,具体主题是: 陈晴阳:<这还是我认识的Visu ...

  8. 北京Uber优步司机奖励政策(4月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. 成都Uber优步司机奖励政策(4月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

随机推荐

  1. 【转】 Camera模仿3D效果的小例子(图片无限旋转)

    import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactor ...

  2. RAID 容量计算器

    https://www.synology.com/zh-cn/support/RAID_calculator   磁盘阵列比较表   n/2 n/2 n n/2 安全性高 综合RAID 0/1优点,理 ...

  3. SSH框架应用中常用Jar包用途介绍

    struts2需要的几个jar包:1)xwork-core-2.1.62)struts2-core-2.1.83)ognl-2.7.34)freemarker-2.3.155)commons-io-1 ...

  4. VBA编程的工程性规划

    看过很多人写的VBA代码,一团一团的,一点规划都没有,为了VBA编程更具工程性,这里讨论一下,并列出自己的一些建议:0.给VBA工程定义一个名字,而非直接使用默认的名称——"VBAProje ...

  5. 为eclipse离线安装hibernate tools插件

    工具/原料   eclipse luna jboss hibernate tools 方法/步骤     下载hibernate tools插件   在eclipse根目录下创建myplugins和l ...

  6. 配置 CSV Data Set Config 来参数化新增客户信息操作

    1.首先根据新增客户信息的http请求,来确定需要参数化的变量,选取符合测试需求且经常变化或未来会变化的变量为需要参数化的变量,如本文中的客户端名称(sys_name).描述(description) ...

  7. 修改Myeclipse的文件默认为UTF-8编码

    一.工程编码默认调整 windows->Preferences...打开"首选项"对话框, 左侧导航树,导航到general->Workspace,右侧 Text fi ...

  8. SQLI DUMB SERIES-12

    (1)检测闭合方式:在username上输入" admin" " 说明输入的username后还有双引号和括号 方法一: (2)通过其他途径知道用户名即可.如 输入&qu ...

  9. C&num; 多线程之Thread类

    使用System.Threading.Thread类可以创建和控制线程. 常用的构造函数有:   // 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在 ...

  10. Transfer-Encoding:chunked 返回数据过长导致中文乱码

    最近在写一个项目的后台时,前端请求指定资源后,返回JSON格式的数据,突然发现在返回的字节数过大时,最后的message中文数据乱码了,对于同一个接口的请求:当数据小时不会乱码,当数据量大了中文就乱码 ...