vector<int> dp(n + 1); for (char c : text1) { // int index = c - 'a'; for (int i = 1, pre = 0; i <= n; ++i) { int temp = dp[i]; dp[i] = c == text2[i - 1] ? pre + 1 : max(dp[i], dp[i - 1]); pre = temp; } } return dp[n];
//dp 空间优化,还是再强调一次,开始之前要思考 int m = s1.length(); int n = s2.length(); vector<int> dp(n + 1); for (int i = 0; i < n; i++) //在s1为空的情况下,需要将s2逐索引删除的ASCII和递增 { dp[i + 1] = dp[i] + s2[i]; } for (char x : s1) { int pre = dp[0]; //在s2为空的前提下,记录下本次s1逐索引删除到空的ASCII和,但是在这之前要保存对应的左上角 dp[0] = dp[0] + x; for (int i = 1; i <= n; i++) { int temp = dp[i]; dp[i] = x == s2[i - 1] ? pre : min(dp[i] + x, dp[i - 1] + s2[i - 1]); pre = temp; } } return dp[n];
//额外空间 vector<int> g; for (int x : nums) { auto it = ranges::lower_bound(g, x); //在指定的排序完成的容器找找到第一个比x大的数并返回迭代器 if (it == g.end()) { g.push_back(x); // >=x 的 g[j] 不存在 } else { *it = x; } } return g.size();
//原地算法 auto end = nums.begin(); for (int x : nums) { auto it = lower_bound(nums.begin(), end, x); *it = x; if (it == end) { // >=x 的 g[j] 不存在 ++end; } } return end - nums.begin();