子序列匹配
原题在这里:
概述:给定两个字符串s,t,问在s中能构成t串的数量(不同下标则不同构造)。
analyse:
记忆化搜索+剪枝:
定义s,t串长度为n,m
定义dfs(u,v):表示在s[i,n)内查找t[v]字符
剪枝:因为需要保证s串剩余字符长度满足后续t串的匹配,就一个遍历优化:
在s[u,n-m+v]内查找t[v]字符
code:
class Solution { string x, y; int n, m; map<pair<int, int>, int> mp; public: int distanceDFS(int u, int v) //在下标[u,n-m+v]之间找y[v] { // 退出条件 if (v == m) return 1; if (u > n) return 0; if (mp.count({u, v}) != 0) return mp[{u, v}]; int val = 0; for (int i = u; i <= n - m + v; i++) if (x[i] == y[v]) val += distanceDFS(i + 1, v + 1); return mp[{u, v}] = val; } int numDistinct(string s, string t) { x = s, y = t; n = s.length(), m = t.size(); return distanceDFS(0, 0); } };
【Over】

浙公网安备 33010602011771号