NC35 最小编辑代价
1、解题思路
dp的思想,dp【i】【j】表示str1的前i个字符修改为str2的前j个字符的代价。
2、代码
import java.util.*;
public class Solution {
/**
* min edit cost
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @param ic int整型 insert cost
* @param dc int整型 delete cost
* @param rc int整型 replace cost
* @return int整型
*/
public int minEditCost (String str1, String str2, int ic, int dc, int rc) {
// write code here
int r = str1.length();
int c = str2.length();
int[][] dp = new int[r + 1][c + 1];
dp[0][0] = 0;
for (int i = 0; i <= c; i++) {
dp[0][i] = i * ic;
}
for (int i = 0; i <= r; i++) {
dp[i][0] = i * dc;
}
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
char s1 = str1.charAt(i - 1);
char s2 = str2.charAt(j - 1);
if (s1 == s2) {
dp[i][j] = dp[i - 1][j - 1];
} else {
int val = Math.min(Math.min(dp[i][j - 1] + ic, dp[i - 1][j] + dc), dp[i - 1][j - 1] + rc);
dp[i][j] = val;
}
}
}
return dp[r][c];
}
}
NC5 二叉树根节点到叶子节点的所有路径和
1、解题思路
dfs的思路吧,到每个节点的时候判断这个结点是不是叶子节点,如果是把当前的值加到结果中。
2、代码
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
private int ans = 0;
private void levelOrder(TreeNode node, int curVal) {
if (node.left == null && node.right == null) {
curVal = curVal * 10 + node.val;
ans = ans + curVal;
} else if (node.left != null && node.right != null) {
levelOrder(node.left, curVal * 10 + node.val);
levelOrder(node.right, curVal * 10 + node.val);
} else if (node.left != null) {
levelOrder(node.left, curVal * 10 + node.val);
} else {
levelOrder(node.right, curVal * 10 + node.val);
}
}
public int sumNumbers(TreeNode root) {
// write code here
if (root == null) {
return 0;
}
levelOrder(root, 0);
return ans;
}
}
NC8 二叉树根节点到叶子节点和为指定值的路径
1、解题思路
基本也是dfs的思想,只是需要注意引用问题。
2、代码
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @param sum int整型
* @return int整型ArrayList<ArrayList<>>
*/
private void dfs(TreeNode node, int cur, int sum, ArrayList<ArrayList<Integer>> list, ArrayList<Integer> temp) {
if (node.left == null && node.right == null) {
temp.add(node.val);
cur = cur + node.val;
if (sum == cur) {
list.add(temp);
}
} else if (node.left != null && node.right != null) {
ArrayList<Integer> list1 = new ArrayList<>(temp);
list1.add(node.val);
dfs(node.left, cur + node.val, sum, list, list1);
ArrayList<Integer> list2 = new ArrayList<>(temp);
list2.add(node.val);
dfs(node.right, cur + node.val, sum, list, list2);
} else if (node.left != null) {
ArrayList<Integer> list1 = new ArrayList<>(temp);
list1.add(node.val);
dfs(node.left, cur + node.val, sum, list, list1);
} else if (node.right != null) {
ArrayList<Integer> list2 = new ArrayList<>(temp);
list2.add(node.val);
dfs(node.right, cur + node.val, sum, list, list2);
}
}
public ArrayList<ArrayList<Integer>> pathSum(TreeNode root, int sum) {
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
if (root == null) {
return list;
}
ArrayList<Integer> temp = new ArrayList<>();
dfs(root, 0, sum, list, temp);
return list;
}
}