字符串匹配

1 常见题目

1.1 (lee-JZ19) 正则表达式匹配

请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.'表示任意一个字符,而’*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"aba"均不匹配。

输入: s = “aa” p = “a”
输出: false
解释: “a” 无法匹配 “aa” 整个字符串。
输入: s = “aab” p = “cab”
输出: true
解释: 因为 ‘*’ 表示零个或多个,这里 ‘c’ 为 0 个, ‘a’ 被重复一次。因此可以匹配字符串 “aab”。

public class RegularExpressionMatching {	
	/*
	 * state: f[i][j]表示 s 的前 i 个字符与 p 中的前 j 个字符是否能够匹配
	 * function: if(p[j]== '*') -- f(i,j) = f[i][j−2]
	 * 			 if(p[j]!= '*') -- f(i,j) = f[i−1][j−1], ​matches(s[i],p[j])
	 *           otherwise =  f[i−1][j] or f[i][j−2],​matches(s[i],p[j−1])
	 *                        f[i][j−2],otherwise
	 *           其中 matches(x,y)判断两个字符是否匹配的辅助函数。只有当y 是 . 或者 x 和 y 本身相同时,这两个字符才会匹配。
	 * initial:f(0,0) = true,两个空字符串是可以匹配的
	 * res:f(m,n)
	 * 时间复杂度:O(m*n)
	 * 空间复杂度:O(m*n)
	 */
	public boolean isMatch(String s, String p) {
		int m = s.length();
		int n = p.length();
		boolean[][] f = new boolean[m+1][n+1];
		f[0][0] = true;
		for(int i = 0;i <= m;i++) {
			for(int j = 1;j <= n;j++) {
				if(p.charAt(j-1) == '*') {
					f[i][j] = f[i][j-2];
					if(maches(s,p,i,j-1)) {
						f[i][j] = f[i][j] || f[i-1][j];
					}
				}else {
					if(maches(s,p,i,j)) {
						f[i][j] = f[i-1][j-1];
					}
				}
			}
		}
		return f[m][n];
    }

	private boolean maches(String s, String p, int i, int j) {
		if(i == 0) {
			return false;
		}
		if(p.charAt(j-1) == '.') {
			return true;
		}
		return s.charAt(i-1) == p.charAt(j-1);
	}
}

2 练习链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值