`
huntfor
  • 浏览: 201097 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[leetcode]Regular Expression Matching

 
阅读更多

新博客地址:

[leetcode]Regular Expression Matching

Regular Expression Matching

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

 这道题不难,但是烦,就是匹配简单的正则表达式,算法也很简单:

写道
由于*写在字符的后面,因此采取从后往前匹配,省的每读一个数还要看看它后面的字符是不是*,事实也证明,逆向匹配效率也更高
定义p为正则表达式,s为字符串。
分情况考虑:
1. p的最后一个字符是普通字符c,则s的最后一个字符(如果存在)也是c,则将p和s的最后一个字符都删去,比较剩下的子串,否则返回false
2. p的最后一个字符是‘.’ ,如果s的长度>0,将p和s的最后一个字符都删去,比较剩下的子串,否则返回false
前两种的处理比较简单,麻烦的是下面的
3. p的最后一个字符是‘*’,又分为三种情况:

3.1 其前驱字符是普通字符,记为a,对p继续往前遍历,看a*前面还有几个a,并记录其个数letterCountInP,比如aaaaa*的letterCountInP = 4。同理对s进行遍历,看字符结尾有几个a,记录其个数letterCountInS,比如baaa的letterCountInS = 3。
如果letterCountInP > letterCountInS则返回false(如上面举得例子)
否则进行swallow,这里我是用的reluctant匹配法,也可以用greedy匹配原则,其实时间复杂度是一样的。具体可以看代码。

3.2 其前驱字符是‘.’,这种情况稍微简单一点,直接尝试对整个s字符串进行匹配,同样采取reluctant匹配法

3.3其他情况,返回false

 代码如下:

public boolean isMatch(String s, String p) {
		if (s == null || p == null) {
			return s == p ;
		}
		if ((!p.contains("*") && !p.contains(".")) || (s.length() == 0 && p.length() == 0)) {
			return s.equals(p);
		}
		Set<Character> letterSet = new HashSet<Character>(Arrays.asList('q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'));
		int tail = p.length() - 1;
		if (letterSet.contains(p.charAt(tail))) {
			if (s.length() >= 1 && p.charAt(tail) == s.charAt(s.length() - 1)) {
				return isMatch(s.substring(0, s.length() - 1), p.substring(0, tail));
			}
			return false;
		}else if(p.charAt(tail) == '.'){
			if(s.length() > 0)return isMatch(s.substring(0, s.length() - 1), p.substring(0, tail));
			return false;
		}else{// *
			// when we met with * we need to check the former letter of it
			//1. if it is a normal letter
			/*
			 * for instance a*, we should also check how many a before a* in p ,and how many a in s,
			 * if there are n 'a' before in p and m 'a' in s,we can just swallow m - n 'a' (if m - n < 0 ,return false)
			 */
			//2. if it is a .
			/* just have a shoot ,swallow none ,then one ,two ,three.... check each 
			 */
			//3. if it is a * return false;
			if(tail == 0) return false;
			else{
				char pre = p.charAt(tail - 1);
				if(letterSet.contains(pre)){
					int letterCountInP = 0,letterCountInS = 0; 
					for(int i = s.length() - 1; i >= 0; i--){
						if(s.charAt(i) == pre){
							letterCountInS++;
						}else break;
					}
					for(int i = tail - 2; i >= 0; i--){
						if(p.charAt(i) == pre){
							letterCountInP++;
						}else break;
					}
					if(letterCountInS < letterCountInP) return false;
					for(int i = 0; i <= letterCountInS; i++){
						if(isMatch(s.substring(0, s.length() - i), p.substring(0, p.length() - 2 - letterCountInP))){
							return true;
						}
					}
					return false;
				}else if(pre == '.'){
					for(int i = 0; i <= s.length(); i++){
						if(isMatch(s.substring(0, s.length() - i), p.substring(0, p.length() - 2))){
							return true;
						}
					}
					return false;
				}else return false;
			}
		}
	}

 

 

分享到:
评论

相关推荐

    c语言-leetcode 0010-regular-expression-matching.zip

    c c语言_leetcode 0010_regular_expression_matching.zip

    js-leetcode题解之10-regular-expression-matching.js

    js js_leetcode题解之10-regular-expression-matching.js

    C语言-leetcode题解之10-regular-expression-matching.c

    c语言入门 C语言_leetcode题解之10-regular-expression-matching.c

    LeetCode 刷题汇总1

    * 正则表达式匹配(Regular Expression Matching):实现正则表达式匹配。 * 实现strStr()(Implement strStr()):实现字符串搜索算法。 7. 排序和搜索: * 合并两个排序列表(Merge Two Sorted Lists):合并两...

    LeetCode题解(java语言实现).pdf

    * Regular Expression Matching in Java:该题目要求匹配字符串和正则表达式,实现方法使用了动态规划算法。 * Merge Intervals:该题目要求合并重叠的区间,实现方法使用了排序和迭代算法。 * Insert Interval:该...

    leetcode中国-leetcode:leetcode刷题

    Expression Matching 递归匹配 wildcard matching 动态规划 longest common prefix , 简单 valid number, hard, 用有限自动机 integer to roman ,easy , 模拟 roman to integer ,easy , 模拟 count and say , easy ,...

    leetcode338-LeetCode:LeetCode刷题总结

    LeetCode刷题总结 1.Two Sum 2.Add Two Numbers 3.Longest Substring Without Repeating Characters 4.Median of Two Sorted Arrays 5.Longest Palindromic Substring (Manacher算法待完成) 6.ZigZag Conversion 7....

    分割数组求最大差值leetcode-Leetcode-Road:LeetCode刷题记录

    分割数组求最大差值leetcode LeetCode 学习之路 记录自己完成LeetCode的代码和结果。...Expression Matching 25.3% 困难 11 Container With Most Water 59.3% 中等 12 Integer to Roman 61.8% 中等 13 Roman to In

    leetcode530-algorithm:算法

    Expression Matching 011 Container With Most Water 012 Integer to Roman 013 Roman to Integer 014 Longest Common Prefix 015 3Sum 016 3Sum Closest 017 Letter Combinations of a Phone Number 018 4Sum 020 ...

    LeetCode题解 - Java语言实现-181页.pdf

    8. Regular Expression Matching in Java 正则表达式匹配是一个字符串问题,要求使用正则表达式来匹配字符串。可以使用Java的Pattern和Matcher类来解决该问题。 9. Merge Intervals 区间合并是一个数组问题,要求...

    LeetCode前400题Java精美版

    10. **Regular Expression Matching** (Hard): 实现正则表达式的匹配功能,涉及递归或动态规划的算法。 11. **Container With Most Water** (Medium): 求两个非降序数组中的最大面积水杯。双指针法是常用的解决策略...

    leetcode添加元素使和等于-leetcode:我的leetcode解决方案

    leetcode添加元素使和等于 经验教训 一定要吧功能尽量细化为函数,这样一者做题思路比较清晰,二者可以在某些情况下直接return值。 如果输入的形式是一个序列,则可以想想:分治、动规、贪婪,一般不建议搜索,因为...

    leetcode写题闪退-LeetCode:leetcodeOJ

    leetcode写题闪退 #*的多少代表此题的有意思程度 有几题第一次写的时候思绪比较混乱: *****Regular Expression Matching 2014.10.29 对于Find Minimum in Rotated Sorted Array II 和 Find Minimum in Rotated ...

    Coding Interview In Java

    10 Regular Expression Matching in Java 39 11 Merge Intervals 43 12 Insert Interval 45 13 Two Sum 47 14 Two Sum II Input array is sorted 49 15 Two Sum III Data structure design 51 16 3Sum 53 17 4Sum 55...

    LeetCode-in-Golang:使用 Golang 解答 LeetCode

    35%2☆ ☆27%3☆ ☆24%4☆ ☆ ☆21%5☆ ☆25%6☆ ☆26%7☆24%8☆ ☆13%9Palindrome Number☆35%10Regular Expression Matching☆ ☆ ☆24%:red_heart:11Container With Most Water☆ ☆36%12Integer to R

    lrucacheleetcode-luoleet:LeetcodesolutionsbyXinhangLuoandQinghaoDai

    https://leetcode.com/problems/regular-expression-matching/ Regular Expression Matching 100 https://leetcode.com/problems/same-tree/ Same Tree 101 https://leetcode.com/problems/symmetric-tree/ ...

    Python_leetcode.zip

    "regular-expression-matching.py"考察的是字符串匹配和回溯算法。Python的字符串操作和递归可以构建出复杂的正则表达式匹配算法,帮助解决复杂的文本处理问题。 "palindrome-pairs.py"是关于回文串和字符串匹配的...

    LeetCode答案大全

    10. Regular Expression Matching:实现正则表达式匹配,需要使用动态规划来解决。 11. Container With Most Water:给定一个包含n个非负整数的数组,设计一个算法找出其中两个数,使得它们与x轴构成的容器可以容纳...

    leetcodepython001-algorithm:leetcode问题(cpp、java、python),书籍破解_the_coding

    leetcode Python 001 leetcode的算法问题 这是我的解决方案,用 ...Expression Matching 011. Container With Most Water 012. Integer to Roman 013. Roman to Integer 014. Longest Common Prefix 019. R

    leetcode答案-leetcode:leetcode

    leetcode 答案 leet code 这是我的leetcode答案,语言主要是用python。很多算法不是最优,甚至很槽糕,有空就会优化 目前完成了: Two Sum Add Two Numbers Longest ...Regular Expression Matching

Global site tag (gtag.js) - Google Analytics