————2020.1.17————

# 算法 || dp || 有限状态自动机 #



*leetcode 10

1、暴力递归(Java)

 1 public static boolean isMatch(String s, String t) {
 2     return match(s, t, 0, 0);
 3     }
 4 public static boolean match(String s, String t, int i, int j) {
 5     if (j == t.length()) return i == s.length();
 6     if(j+1 == t.length() || t.charAt(j+1) != ‘*‘) {
 7         return i != s.length() && (t.charAt(j) == s.charAt(i) || t.charAt(j) == ‘.‘)
 8                 && match(s, t, i+1, j+1);
 9     }
10     while(i != s.length() && (t.charAt(j) == s.charAt(i) || t.charAt(j) ==‘.‘)) {
11         if(match(s, t, i, j+2)) return true;
12         i++;
13     }
14     return match(s, t, i, j+2);
15 }

重复操作太多,故考虑改dp。

2、动态规划(Java)

 1 public static boolean dpmatch(String s, String t) {
 2     int m = s.length(), n = t.length();
 3     if(m == 0 && n ==0) return true;
 4     else if (m != 0 && n == 0) return false;
 5     boolean [][] dp = new boolean[m+1][n+1];
 6     dp[m][n] = true;
 7     for (int j = n-2;j>=0;j = j-2) {
 8         if(t.charAt(j+1) == ‘*‘ && t.charAt(j) != ‘*‘) dp[m][j] = true;
 9         else break;
10     }
11     if(m == 0) return dp[0][0];
12     if(t.charAt(n-1) == ‘.‘ || t.charAt(n-1) == s.charAt(m-1)) dp[m-1][n-1] = true;
13     for(int i = m-1; i>=0; i--) {
14         for(int j = n-2; j>=0; j--) {
15             if(t.charAt(j+1) != ‘*‘) {
16                 dp[i][j] = (t.charAt(j) == s.charAt(i) || t.charAt(j) == ‘.‘)
17                         &&dp[i+1][j+1];
18             } else {
19             int p = i;
20             while (p != s.length() && (t.charAt(j) == s.charAt(p) || t.charAt(j) ==‘.‘)) {
21                 if(dp[p][j+2]) {
22                     dp[p][j] = true;
23                     break;
24                 }
25                 p++;
26             }
27             if(dp[i][j] != true)
28             dp[i][j] = dp[p][j+2];
29             }
30         }
31     }
32     return dp[0][0];
33 }

3、非确定有限状态机(nondeterministic finite automaton)

详细待补充,代码参照题解。(Java)

  1 import java.util.Arrays;
  2 import java.util.HashMap;
  3 import java.util.HashSet;
  4 import java.util.LinkedList;
  5 import java.util.List;
  6 import java.util.Map;
  7 import java.util.Set;
  8
  9 public class Solutions {
 10     class Solution {
 11         public boolean isMatch(String s, String p) {
 12             State dfa = buildStateChain(p);
 13             Set<State> dfaSet = new HashSet<>();
 14             dfaSet.add(dfa);
 15             int index = -1;
 16             while(++index < s.length()){
 17                 char ch = s.charAt(index);
 18                 String input = String.valueOf(ch);
 19                 Set<State> newStateSet = new HashSet<>();
 20                 for(State state : dfaSet){
 21                     List<State> newList = state.changeState(input);
 22                     if(newList != null){
 23                         newStateSet.addAll(newList);
 24                     }
 25                 }
 26                 dfaSet  = newStateSet;
 27                 if(dfaSet.size() <= 0){
 28                     break;
 29                 }
 30             }
 31
 32             boolean isMatch = false;
 33             for(State state : dfaSet){
 34                 if(state.isEnd()){
 35                     isMatch = true;
 36                     break;
 37                 }
 38             }
 39
 40             return isMatch;
 41         }
 42
 43           public State buildStateChain(String p){
 44             State start = new State();
 45             start.setStart(true);
 46
 47             List<State> currentLevelStateList = Arrays.asList(start);
 48             for(int i = 0; i < p.length(); i++){
 49                 char current = p.charAt(i);
 50                 if(current == ‘*‘){
 51                     continue;
 52                 }
 53                 Character next = null;
 54                 if(i < p.length() - 1){
 55                     next = p.charAt(i + 1);
 56                 }
 57
 58                 List<State> nextLevelStateList = new LinkedList<>();
 59                 State nextState = new State();
 60                 nextLevelStateList.add(nextState);
 61                 String currentStr = String.valueOf(current);
 62                 for(State currentState : currentLevelStateList) {
 63                     currentState.addNextState(currentStr, nextState);
 64
 65                     // 如果是x* 这种形式的话,状态有个自循环,并且当前状态需要建立一个和下下个状态的关系
 66                     if (next != null && next.equals(‘*‘)) {
 67                         nextLevelStateList.add(currentState);
 68                         nextState.addNextState(currentStr, nextState);
 69                     }
 70                 }
 71
 72                 currentLevelStateList = nextLevelStateList;
 73             }
 74
 75             for(State currentState : currentLevelStateList) {
 76                 currentState.setEnd(true);
 77             }
 78
 79             return start;
 80         }
 81
 82         class State{
 83             private boolean start;
 84             private boolean end;
 85
 86             // 状态转移mapping
 87             private Map<String, List<State>> nextMap = new HashMap<>();
 88
 89             public List<State> changeState(String input){
 90                 List<State> result = new LinkedList<>();
 91                 List<State> nextList = nextMap.get(input);
 92                 if(nextList != null){
 93                     result.addAll(nextList);
 94                 }
 95                 nextList = nextMap.get(".");
 96                 if(nextList != null){
 97                     result.addAll(nextList);
 98                 }
 99
100 //                List<State> forEmptyList = nextMap.get("");
101 //                if(forEmptyList != null){
102 //                    result.addAll(forEmptyList);
103 //                }
104
105                 return result;
106             }
107
108             public boolean isStart() {
109                 return start;
110             }
111
112             public void setStart(boolean start) {
113                 this.start = start;
114             }
115
116             public boolean isEnd() {
117                 return end;
118             }
119
120             public void setEnd(boolean end) {
121                 this.end = end;
122             }
123
124             public void addNextState(String input, State next){
125                 List<State> nextList = nextMap.get(input);
126                 if(nextList == null){
127                     nextList = new LinkedList<>();
128                     nextMap.put(input, nextList);
129                 }
130                 nextList.add(next);
131             }
132
133         }
134     }


# Edit : 2020.1.17

原文地址:https://www.cnblogs.com/zzl1209/p/12207181.html

时间: 2024-11-06 09:45:21

————2020.1.17————的相关文章

随笔2020.1.17

期末考成绩出了.尘埃落定,然后炸了.不过我没啥心情波动,除了化学成绩出来的时候抹了把眼泪其他没啥了,毕竟考了两次班倒一也太可悲了. 不过被学得挺好可能有一两科发挥失常的人好好得膜上了几发,还是蛮不爽的哈哈. 算是意料之中,毕竟自己之前学习态度就不怎么样,凭什么比好好努力的同学要考的好? 或许是因为最近老是熬夜,我实在是太困了,在公交车上睡着了.猛然抬头发现车子正使出公交车站,我忙上前询问司机:"能开开门让我下车吗?" 我得到了否定的回答,这也是应该的.抬头看了看司机工牌上的五个大红星,

每日思考(2020/01/17)

题目概览 Standards模式和Quirks模式有什么区别 浏览器是怎样判断元素是否和某个CSS选择器匹配? 造成内存泄漏的操作有哪些 题目解答 Standards模式和Quirks模式有什么区别 定义:quirks模式是浏览器的怪异模式,该模式下浏览器对页面的渲染会比较怪异.平时使用的都是standards模式,又称strict模式 QUIRKS来历:在W3C标准出台以前, 浏览器在对页面的渲染上没有统一规范,产生了差异 (Quirks mode或者称为Compatibility Mode)

2020.3.17

幸好自己总懒到爆炸,现在小说作者都日更,月更:我翻看了自己的博客发现自己居然是个 年更,哈哈. 其实2019年是挺不平凡的一年,这一年经历了我对北京.对于现实的认识.怎么说,记录一下事件慢慢来吧. 2019年6月份,鼓起勇气跟主管申请了离职,在大环境的前提下领导也没有什么挽留,这一年里,各种互联网不景气,大厂吃小厂,小厂倒闭 ,这种事情在这一年格外的多. 当时离职没有想法,好听一点想出去看看,难听的话就是头脑一热,直接跟领导提了离职.没有下家,最后的退路就是回老家去谋求一份工作把:也就靠着这口热

2020年AI、CV、NLP顶会最全时间表

2020年AI.CV.NLP顶会最全时间表 2019-09-01 14:04:19 weixin_38753768 阅读数 40 2020 AI.CV.NLP主流会议时间表,包含会议举办的时间.地点.投稿截止日期.官方网址/社交媒体地址,还有H指数(谷歌学术的期刊会议评判标准,即过去5年内有至多h篇论文被引用了至少h次). 2月 AAAI 2020 会议名称: Association for the Advancement of Artificial Intelligence 会议地点: New

2020京东年货节

京东年货节红包,每天可领取三次,最高888元. 红包每天可以领取,购物可叠加使用,无门槛. 活动时间:2019/12/30 ~ 2020/01/12 使用时间:2019/12/30 - 2020/01/17 领取地址:京东年货节红包 原文地址:https://www.cnblogs.com/snow365/p/12147170.html

DevExpress ChartControl 样式设置

第三方控件,设置ChartControl的样式,仅供参考 Demo: <Grid> <Grid.Resources> <SolidColorBrush x:Key="GridLineBursh" Color="CornflowerBlue"></SolidColorBrush> </Grid.Resources> <dxc:ChartControl Background="Transpare

Java中日期格式化YYYY-DD的坑

摘自:https://www.cnblogs.com/tonyY/p/12153335.html Java中日期格式化YYYY-DD的坑 2020-01-05 19:27  兔子托尼啊  阅读(115)  评论(0)  编辑  收藏 写这篇博文是记录下跨年的bug.去年隔壁组的小伙伴就是计算两个日期之间间隔的天数,因为跨年的原因计算有误. 当时测试组的小姐姐也没有模拟出来这种场景,导致上生产环境直接影响线上的数据. 今天逛技术论论坛正好遇到Java日期的操作bug. 1 yyyy 和 YYYY

安装oracleXE快捷版(二)

-bash-3.2$ 是oracle用户下的提示符 [[email protected] ~]# 是root用户下的提示符 #用root去修改oracle用户的密码123456[[email protected] ~]# passwd oracleChanging password for user oracle.New UNIX password: BAD PASSWORD: it is too simplistic/systematicRetype new UNIX password: pa

004.kubernets对于pod的简单管理

一 pod简介 1.1 介绍 Pod是K8s集群中所有业务类型的基础 Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的. Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统 pod和容器的区别就是,一个pod可以有多个容器,当一个pod只有一个容器的时候,访问pod就是访问容器,对于一个kubernets来说,一个pods至少有两个容器,一个是不可见的,称为pause容器,另一个就是业务容器 pod是一个逻辑概念,pod中的一个容器异常,整个pod重新创建