class Solution {
public int minDistance(String word1, String word2) {
if(word1 == null || word2 == null) return 0;
char[]cs1 = word1.toCharArray();
char[]cs2 = word2.toCharArray();
int dp[][] = new int[cs1.length+1][cs2.length+1];
dp[0][0] = 0;
//第0列
for(int i = 1; i <= cs1.length; i++){
dp[i][0] = i;
}
//第0行
for(int i = 1; i <= cs2.length; i++){
dp[0][i] = i;
}
//其他行其他列
for(int i = 1; i <= cs1.length; i++){
for(int j = 1; j <= cs2.length; j++){
int top = dp[i - 1][j] + 1;
int left = dp[i][j - 1] + 1;
int leftTop = dp[i - 1][j - 1];
if(cs1[i - 1] != cs2[j - 1]){
leftTop++;
}
dp[i][j] = Math.min(Math.min(top , left), leftTop);
}
}
return dp[cs1.length][cs2.length];
}
}
代码
class Solution {
public String longestPalindrome(String s) {
if(s == null) return s;
char[] cs = s.toCharArray();
if(cs.length == 0) return s;
//最长回文子串长度(至少是1)
int maxLen = 1;
//最长回文子串的开始索引
int begin = 0;
boolean[][] dp = new boolean[cs.length][cs.length];
//从上到下(i由大到小)
for(int i = cs.length - 1; i >= 0; i--){
//从左到右(j由小到大)
for(int j = i; j <cs.length; j++){
//cs[i,j]的长度
int len = j - i + 1;
dp[i][j] = (cs[i] == cs[j]) && (len <= 2 || dp[i + 1][j - 1]);
if(dp[i][j] && len > maxLen){
//说明cs[i,j]是回文串
maxLen = len;
begin = i;
}
}
}
return new String(cs, begin, maxLen);
}
}