給出乙個單詞列表,其中每個單詞都由小寫英文本母組成。如果我們可以在 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...