1.トピック
2.回答
でアルゴリズムをバックトラックに、我々はこの問題を解決するための再帰的なアイデアをご紹介します。
また、この問題は、動的プログラミングのアイデアを解決することができます。私たちは、状態を定義する(P [i]の[jは\ ] \) サブです(私は、0 [秒)\ \) とP [0、J)(\ \) 、それ以外の場合はfalseで、試合に一致は、真であります次に、状態遷移方程式は、次の3つの場合に分けることができます。
-
- 場合
p[j-1] != ‘*’ && (s[i-1] == p[j-1] || p[j-1] == ‘.’)
、2つの文字は、現在の説明ではなく出会いと一致(\ '*')\、時間、P[i][j] = P[i-1][j-1]
すなわちとき\(S [0、I- 1)\) と\(P [0、J 1 )\)一致、\(S [0、I) \) と\(P [0、j)は \) 一致させることができます。
- 場合
-
- もし
p[j-1] == ‘*’
、ショー現在の文字があることを\( '*' \) 、そして私たちは、その後、ゼロの文字を一致させるためにそれを使用P[i][j] = P[i][j-2]
する場合、すなわち、\(S [0、I) \) と\(P [0、J- 2)\ )一致がスキップされる(P [J-2] \ 、P [J-1] \) 二つの要素の後に[0、I)\(S \) と\(P [0、J) \) CAN試合;
- もし
-
- 場合は
p[j-1] == ‘*’
、説明したように、現在の文字\(「*」\) 、そして我々はそれを使用するには、満たすために、少なくとも一つの文字、および必要合わせてs[i-1] == p[j-2] || p[j-2] == ‘.’
、その後、P[i][j] = P[i-1][j]
すなわちを、とき\(S [0、I- 1)\) と\(P [ 0、J)\)試合、我々は使用\( '*' \)と一致する[I-1] \ \ sの () 、後に)\(S [0、I)を\と\(P [0、 J)\)も一致することができるようになります。ここで平均少なくとも一つの\( '*' \)一度、しかし目の前に使用されている([0、I-S \ 1)\) と\(P [0、J) \) マッチングを使用することもできます。
- 場合は
2以下のようにのみ、一致を満たすことができる3。
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size();
int n = p.size();
vector<bool> temp(n+1, false);
vector<vector<bool> > dp(m+1, temp);
dp[0][0] = true;
for (int j = 1; j <= n; j++)
if (p[j - 1] == '*')
dp[0][j] = dp[0][j-2];
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (p[j - 1] == '*')
{
bool repeat_zero = false;
bool repear_one_more = false;
repeat_zero = dp[i][j - 2];
if (s[i - 1] == p[j - 2] || p[j - 2] == '.')
repear_one_more = dp[i - 1][j];
dp[i][j] = repeat_zero || repear_one_more;
}
else
{
if (s[i - 1] == p[j - 1] || p[j - 1] == '.')
dp[i][j] = dp[i-1][j-1];
}
}
}
return dp[m][n];
}
};
よりエキサイティングな、してください注意を払うために「seniusen」!