Leetcode 010 Regular Expression Matching (DP)

题目连接:Leetcode 010 Regular Expression Matching 

解题思路:dp[i][j] 表示s[0-i] 和 p[0-j] 两个子串是否匹配。因为'*'代表的值和它前一个值有关系,所以需要对p串进行预处理,标记哪些字符可以匹配若干个。

class Solution {
	public:
		bool isMatch(string s, string p) {
			int ns = s.size();
			int np = p.size();

			int* flag = new int[np];
			memset(flag, 0, sizeof(flag));

			string t;
			for (int i = 0; i < np; i++) {
				if (p[i] != '*') t += p[i];
				else flag[t.size()-1] = 1;
			}

			int nt = t.size();

			int** dp = new int*[ns+1];
			for (int i = 0; i <= ns; i++)
				dp[i] = new int[nt+1];
			dp[0][0] = 1;

			for (int i = 0; i <= ns; i++) {
				for (int j = 1; j <= nt; j++) {
					dp[i][j] = 0;
					if (i && (s[i-1] == t[j-1] || t[j-1] == '.'))
						dp[i][j] |= dp[i-1][j-1];

					if (flag[j-1]) {
						dp[i][j] |= dp[i][j-1];
						if (i && (s[i-1] == t[j-1] || t[j-1] == '.'))
							dp[i][j] |= dp[i-1][j];
					}
				}
			}
			return dp[ns][nt] == 1;
		}
};

猜你喜欢

转载自blog.csdn.net/u011328934/article/details/80601324