力扣1143:最長公共子串行
思路:這是一道經典題,dp[i][j]表示第乙個字串[0,i-1]和第二個字串[0,j-1]之間公共的子串行個數,每次多比較乙個,dp[i][j]可以由dp[i-1][j-1]、dp[i][j-1]、dp[i-1][j]得到。
class力扣1143solution
}return
dp[len1][len2];}}
牛客練習賽70b
題意:求最短子串長度,要求包含"puleyaknoi"子串行。
思路:子串行的字元用乙個前驅陣列維護,指定子串行的上乙個字元是什麼,這裡10個字元沒有重複,一維就夠了。對子序列的字元每次同步前驅字元的位置,找到子串行的起點。不可以直接記錄子串行起點的位置,可能會被最近更新的起點位置覆蓋。
#include#include思路擴充套件:子串行可以出現多次相同字元,則dp陣列多開一維,dp[x][j]=dp[pre[x][j].c][pre[x][j].d],dp[x][j]表示當前字母x與模式串中第j個x字母匹配時,最近的起始位置。pre[x][j].c表示模式串中第j個x字母的前乙個字母,pre[x][j].d表示模式串中第j個x字母的前乙個字母是第幾次出現。#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define inf 0x3f3f3f3f
using
namespace
std;
char s[100005
];int num[30];///
模式串int dp[30];///
char a=;
int pre[30];///
模式串字元的前驅字元
intmain()
intt;
scanf("%d
",&t);
while(t--)
else
if( s[i]=='
i' && dp[ x ]!=-1 )///
10個夠了,並且i字元有前驅,一直連到p
ans=min(ans,i-dp[x]+1
); }
if(ans==inf)
printf(
"-1\n");
else
printf(
"%d\n
",ans);
}return0;
}
最長有序子串行 經典DP
給一串資料i0 1234 5678 num i 14 7258 369 來得到其對應位上的資料的最長有序子串行的長度l i0 1234 5678 num i 14 7258 369f i 12 3234 345 這是個經典的dp問題。在這裡我們利用f i 的陣列 來儲存其之前資料的最長有序子串行 進...
最長上公升子串行,經典
class solution def lengthoflis self,nums list int int 方法一,動態規劃 ifnot nums return 0 dp 1 len nums dp以0位結尾的,最長上公升子串行長度為1 for i in range 1 len nums for j...
經典Dp 單調遞增最長子序列 經典dp
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 求乙個字串的最長遞增子串行的長度 如 dabdbf最長遞增子串行就是abdf,長度為4 輸入第一行乙個整數0 輸出輸出字串的最長遞增子串行的長度 樣例輸入 3 aaaababc abklmncdefg 樣例輸出 1 37 inc...