一、leetcode题目
1.目标和
题目描述
给你一个整数数组 nums
和一个整数 target
。
向数组中的每个整数前添加 '+'
或 '-'
,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1]
,可以在 2
之前添加 '+'
,在 1
之前添加 '-'
,然后串联起来得到表达式 "+2-1"
。
返回可以通过上述方法构造的、运算结果等于 target
的不同 表达式 的数目。
2.测试用例
输入:
nums = [1,1,1,1,1], target = 3
输出:
5
解释:
一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3
提示
- 1 <= nums.length <= 20
- 0 <= nums[i] <= 1000
- 0 <= sum(nums[i]) <= 1000
- -1000 <= target <= 1000
3.思路
因为数总和是不变的,那么想要组成指定值,那么组成正数与负数的数值也为固定值。可得:
- left + right = sum(left为组成正数部分的数值,right为组成负数部分的数值)
- left - right = target
- left = (sum + target) / 2
现在问题即转换为组成left
有多少种方法。使用动态规划即可解决。
4.算法实现
class Solution {
public int findTargetSumWays(int[] nums, int target) {
int sum = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
}
if((sum+target)%2 != 0 || (sum+target)<0) return 0;
int n = (sum + target) / 2;
int[] dp = new int[n+1];
dp[0] = 1;
for(int i = 0; i < nums.length; i++){
for(int j = n; j >= 0; j--){
if(j >= nums[i]) dp[j] += dp[j-nums[i]];
}
}
return dp[n];
}
}
二、蓝桥题目
1.密码脱落
题目描述
X 星球的考古学家发现了一批古代留下来的密码。
这些密码是由A、B、C、D
四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
你的任务是:给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。
输入描述
输入一行,表示现在看到的密码串(长度不大于 1000)。
** 输出描述**
要求输出一个正整数,表示至少脱落了多少个种子。
2.测试用例
输入:
ABDCDCBABC
输出:
3
3.思路
先判断出最长的回文子序列,再使用原有长度减去能够组成的回文子序列长度,既是脱落的种子数量。
4.算法实现
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
String s = scan.next();
int n = s.length();
if(n < 2){
System.out.println(0);
return ;
}
int maxlen = 1;
int[][] dp = new int[n][n];
for(int i = 0; i < n; i++){
dp[i][i] = 1;
}
char[] arr = s.toCharArray();
for(int i = n - 2; i >= 0; i--){
for(int j = i + 1; j < n; j++){
if(arr[i] == arr[j]){
if(j - i + 1 < 3){
dp[i][j] = 2;
}else{
dp[i][j] = dp[i+1][j-1] + 2;
}
}else{
dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
}
if(maxlen < dp[i][j]) maxlen = dp[i][j];
}
}
System.out.println(n - maxlen);
scan.close();
}
}