首页 > 其他 > 详细

判断子序列

时间:2021-07-28 18:09:05      阅读:15      评论:0      收藏:0      [点我收藏+]

题源:leetcode

链接:https://leetcode-cn.com/problems/is-subsequence/

技术分享图片

 

 

使用双指针法很简单,而且运行效率也很高。这里不贴代码了,学习一下动态规划的解法;

 1   //dp解法
 2     bool isSubsequence(string s, string t){
 3         int n = s.length(),m = t.length();
 4         //dp数组dp[i][j]表示字符串t以i位置开始第一次出现字符j的位置
 5         vector<vector<int>> dp(m + 1,vector<int> (26,0));
 6 
 7         //初始化边界条件,dp[i][j] = m表示t中不存在字符j
 8         for(int i=0;i<26;i++){
 9             dp[m][i] = m;
10         }
11 
12         //从后往前递推初始化dp数组
13         for(int i = m - 1;i>=0;i--) {
14             for(int j=0;j<26;j++){
15                 if(t[i] == a + j){
16                     dp[i][j] = i;
17                 }else {
18                     dp[i][j] = dp[i + 1][j];
19                 }
20             }
21         }
22 
23         int add = 0;
24         for(int i = 0;i<n;i++){
25             //t中没有s[i] 返回false
26             if(dp[add][s[i] - a] == m){
27                 return false;
28             }
29             //否则直接跳到t中s[i]第一次出现的位置之后一位
30             add = dp[add][s[i] - a] + 1;
31         }
32         return true;
33     }

 

判断子序列

原文:https://www.cnblogs.com/hosheazhang/p/15070391.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!