動態規劃 1048 最長字串鏈

2021-09-23 05:58:11 字數 1145 閱讀 3784

給出乙個單詞列表,其中每個單詞都由小寫英文本母組成。如果我們可以在 word1 的任何地方新增乙個字母使其變成 word2,那麼我們認為 word1 是 word2 的前身。例如,「abc」 是 「abac」 的前身。詞鏈是單詞 [word_1, word_2, …, word_k] 組成的序列,k >= 1,其中 word_1 是 word_2的前身,word_2 是 word_3 的前身,依此類推。從給定單詞列表 words 中選擇單詞組成詞鏈,返回詞鏈的最長可能長度。

示例:輸入:[「a」,「b」,「ba」,「bca」,「bda」,「bdca」]

輸出:4

解釋:最長單詞鏈之一為"a",「ba」,「bda」,「bdca」。

思路:典型的動態規劃

先把words中的字串從短到長排序

定義dp,長度為words.legnth(),其中dp[i]表示words[0…i] (從下標0到i)中的最長字串鏈。重點dp[i] = max+1,其中,j是words[i]的前身下標,j屬於{0,…,i-1}。如果words[0…i-1]中不存在words[i]的前身,那麼dp[i] = 1

返回dp中的最大值

**:

//最長字串鏈

public int longeststrchain(string words)

});int dp = new int[words.length];

for(int i=0;i=0)

}tail--;

}dp[i] = max==integer.min_value ? 1:max+1;

}arrays.sort(dp);

return dp[dp.length-1];

}private boolean ischild(string child, string father)

}//將fa[pos]插入ch[i]上

char res = new char[fa.length];

for(int i=0;ielse if(i}

string s = string.valueof(res);

return s.equals(father);

}}

最長公共字串(動態規劃)

題目 給定兩個字串 str1 和 str2,返回兩個字串的最長公共子串。舉例 str1 1ad12345cd str2 12345ef 返回 12345 要求 如果str1 長度為m,str2長度為n,實現時間複雜度為o m n 額外空間複雜度 為o 1 的方法。實現 include include...

動態規劃 最長公共字串

思想 首先通過構造二維陣列,較長字串a作為行,較短字串b作為列。將第一行和第一列初始化全初始化為1,通過遞推式,如果當前兩個字串相等,則為左上角的數字加1,否則為0。找出最大的數字,最大的數字表示公共字串的長度。找出公共字串在字串a的角標,從後往前數公共字串個長度即為公共字串。word a yawi...

最長公共子字串 動態規劃

x y x和y的longest common substring為 長度為2 動態規劃解法 c i j 表示x 0.xi和y 0.yj的最大substringx i yj 的長度,比如 x y c 1 1 1 c 2 2 2 c 3 3 0 c 4 4 1 動態轉移方程為 如果xi yj,則 c i...