NC46 加起来和为目标值的组合
1、解题思路
深搜去重,这种也是先排序。这种是枚举子集,通过下面的语句可以去重。index是当前dfs起始的下标。
if (i != index && nums[i] == nums[i - 1]) { continue; }
2、代码
import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
private void dfs(ArrayList<ArrayList<Integer>> lists, int index, int target, int sum, ArrayList<Integer> list, int[] nums) {
if (target == sum) {
lists.add(new ArrayList<>(list));
} else {
for (int i = index; i < nums.length; i++) {
if (i != index && nums[i] == nums[i - 1]) {
continue;
}
if(nums[i] + sum <= target){
list.add(nums[i]);
dfs(lists, i + 1, target, sum + nums[i], list, nums);
list.remove(list.size() - 1);
}
}
}
}
public ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
Arrays.sort(num);
ArrayList<Integer> list = new ArrayList<>();
dfs(lists, 0, target, 0, list, num);
return lists;
}
}
NC49 最长的括号子串
1、解题思路
一维dp,注意往前演变的时候,数组不能越界。
2、代码
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return int整型
*/
public int longestValidParentheses (String s) {
int[] dp = new int[s.length()];
int ans = 0;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == ')') {
if (s.charAt(i - 1) == '(') {
if (i < 2) {
dp[i] = 2;
} else {
dp[i] = dp[i - 2] + 2;
}
} else if (i - dp[i - 1] - 1 >= 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
if (i - dp[i - 1] - 2 >= 0) {
dp[i] = 2 + dp[i - 1] + dp[i - dp[i - 1] - 2];
} else {
dp[i] = 2 + dp[i - 1] + 0;
}
}
}
if (ans < dp[i]) {
ans = dp[i];
}
}
return ans;
}
}
NC55 最长公共前缀
1、解题思路
依次截取第一个字符串的子串,判断剩余字符串是否含有该前缀。
2、代码
import java.util.*;
public class Solution {
/**
*
* @param strs string字符串一维数组
* @return string字符串
*/
public String longestCommonPrefix (String[] strs) {
if (strs.length == 0) {
return "";
}
int len = strs[0].length();
for (int i = 1; i <= len; i++) {
String str = strs[0].substring(0,i);
for (int j = 1; j < strs.length; j++) {
if (!strs[j].startsWith(str)) {
return strs[0].substring(0, i - 1);
}
}
}
return strs[0];
}
}