兩道子串行經典題目

2022-01-12 13:32:07 字數 1356 閱讀 7245

力扣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

solution

}return

dp[len1][len2];}}

力扣1143

牛客練習賽70b

題意:求最短子串長度,要求包含"puleyaknoi"子串行。

思路:子串行的字元用乙個前驅陣列維護,指定子串行的上乙個字元是什麼,這裡10個字元沒有重複,一維就夠了。對子序列的字元每次同步前驅字元的位置,找到子串行的起點。不可以直接記錄子串行起點的位置,可能會被最近更新的起點位置覆蓋。

#include#include

#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陣列多開一維,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字母的前乙個字母是第幾次出現。

最長有序子串行 經典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...