知识点
动态规划
思路
因为要求刚好匹配 所以
不满足则不可以, 所以
定义f[i][j]
表示t的前i个字符 是否满足能 s前i个字符和x的前i-j个字符匹配
由于 所以状态数最多20000个
每次状态转移, 讨论当前t中的字符和哪一个字符串的字符相匹配, 单次转移的时间复杂度为
总的时间复杂度
AC Code (c++)
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @param x string字符串 * @param t string字符串 * @return bool布尔型 */ bool isInterleave(string s, string x, string t) { int n = s.size(), m = x.size(), N = t.size(); if (m + n != N) return false; vector<vector<bool>> f(N + 1, vector<bool>(n + 1, false)); // f[i][j] t前i个字符 是否满足 s前i个字符和 和x的前i-j个字符 f[0][0] = true; for (int i = 1; i <= N; i ++) { for (int j = 0; j <= i; j ++) { if (j and t[i - 1] == s[j - 1]) f[i][j] = (f[i][j] or f[i - 1][j - 1]); if (i - j and t[i - 1] == x[i - j - 1]) f[i][j] = (f[i][j] or f[i - 1][j]); } } return f[N][n]; } };