题目描述
我直接用了正则表达式的算法,不提也罢。
官方解题
public class Solution {
public bool IsMatch(string s, string p) {
bool[,] result = new bool[s.Length+1,p.Length+1];
result[s.Length, p.Length] = true;
for (int i = s.Length; i >= 0; i--)
{
for (int j = p.Length-1; j >= 0; j--)
{
bool F_ck = (i < s.Length && (s.ElementAt(i) == p.ElementAt(j) || p.ElementAt(j) == '.'));
if (j + 1 < p.Length && p.ElementAt(j+1) == '*')
{
result[i, j] = F_ck && result[i+1, j] || result[i, j+2];
}
else
{
result[i, j] = F_ck && result[i + 1, j+1];
}
}
}
return result[0,0];
}
}
解题思想:
1、创建一个bool类型二维数组,存放每个P中字符可与S匹配成功的结果;
2、结果格式:result[i, j] = F_ck && result[i + 1, j+1]; 代表上个字符匹配结果影响之后匹配结果(注:一旦有一个字符未匹配成功,那之后的所有匹配结果都为false,最终result[0,0]也会为false);
3、F_ck 代表当前两个字符是否匹配,考虑p中存在字符“.”的情况;
(s.ElementAt(i) == p.ElementAt(j) || p.ElementAt(j) == '.')
4、当p存在字符“*”时(j+1位置),那p(j+1)位置无效,不需要匹配,这其中存在两种种情况:
① 匹配零个前面元素
string s = "abc";
string p = "a*bc";
//处理该情况代码
result[i, j] = F_ck && result[i+1, j] || result[i, j+2];
//j+1为*,s的字符“a”与p的字符“a”匹配(F_ck ),且s的字符“b”与p的字符“b”匹配(result[i, j+2])固为true
① 匹配一个前面元素
string s = "aac";
string p = "a*c";
//处理该情况代码
result[i, j] = F_ck && result[i+1, j] || result[i, j+2];
//j+1为*,s的第二个字符“a”与p的字符“a”匹配 固为true(result[i+1, j]);