加起来和为目标值的组合&&最长的括号子串&&最长公共前缀

178 阅读1分钟

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];
    }
}