DAY58
今天的主题是:编辑距离。在字符串进行增删字符的操作。
392判断子序列,简单
首先想到快慢双指针:
通过了,很好:
- class Solution {
- public:
- bool isSubsequence(string s, string t) {
- int slow=0;
- for(int fast=0;fast<t.size();fast++){
- if(t[fast]==s[slow]) slow++;
- }
- if(slow==s.size()) return true;
- return false;
- }
- };
动态规划:没有想法尤其是遍历顺序及递推公式(不要用bool 就好想了 ),积累经验吧:
要看出来,这题和求最长公共子序列是一样的,递推公式有点区别,但也是继承。
使用二维数组来记录字符比较结果。
Dp[i][j] 相同长度。
Code:
写了两个for循环,运行时间竟然是最优的,击败100%,奇怪了
- class Solution {
- public:
- bool isSubsequence(string s, string t) {
- vector<vector<int>> dp(s.size()+1,vector<int>(t.size()+1,0));
- for(int i=1;i<=s.size();i++){
- for(int j=1;j<=t.size();j++){
- if(s[i-1]==t[j-1]) dp[i][j]=dp[i-1][j-1]+1;
- else dp[i][j]=dp[i][j-1];
- }
- }
- return dp[s.size()][t.size()]==s.size();
- }
- };
115不同的子序列,困难
这题要做的要是编辑距离(仅删除似乎不够,还需要把删除的添加回来,但是这些操作都只在一个字符串上进行),积累经验:
显然如果是求连续子序列,就可以用KMP(记得复习KMP模板);
尝试着写递推公式,纸质笔记:
Code:
注意取模操作。
- class Solution {
- public:
- long long pow(int n){
- return 1e9;
- }
- int numDistinct(string s, string t) {
- vector<vector<long long>> dp(s.size()+1,vector<long long>(t.size()+1));
- for(int i=1;i<s.size()+1;i++) dp[i][0]=1;
- for(int i=1;i<t.size()+1;i++) dp[0][i]=0;
- dp[0][0]=1;
- for(int i=1;i<=s.size();i++){
- for(int j=1;j<=t.size();j++){
- if(s[i-1]==t[j-1]) dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%(int)(pow(9)+7);
- else dp[i][j]=(dp[i-1][j])%(int)(pow(9)+7);
- }
- }
- return dp[s.size()][t.size()];
- }
- };