5. 最长回文子串
本题,需要求出给定字符串中的最长回文子串。
解题思路,既然要求最长,就设置一个len来记录最长字串,初始化为1。
采用扩散的方法,设置一个left和right,以及maxstart。
while(left >= 0 && s.charAt(left) == s.charAt(i)) {
left--;
len++;
}
while(right < n && s.charAt(right) == s.charAt(i)) {
right++;
len++;
}
while(left >= 0 && right < n && s.charAt(left) == s.charAt(right)) {
left--;
right++;
len = len + 2;
}
if(len > maxlen ) {
maxlen = len;
maxstar = left;
}
每一次循环,将len重置为1。因为发散的中心点更替了。
494. 目标和
采用回溯法。回溯函数设置一个index和当前所得到的和
public void dnn(int[] nums, int target, int index, int sum) {
if(index == nums.length) {
if(sum == target) {
count++;
}
}else{//【else注意】
dnn(nums, target, index + 1, sum + nums[index]);
dnn(nums, target, index + 1, sum - nums[index]);
}
}
本人在做的时候,没有写else导致了结果的错误。
1049. 最后一块石头的重量 II
本题最重要的是,如何发掘解题思路。
因为本题是要让,最终重量尽可能的小。所以就是让取出的重量尽可能的靠近sum / 2;
因此本问题可以看作是背包容量为⌊sum/2⌋,物品重量和价值均为stones[i]的 0-1 背包问题。
依旧设置一个二维数组,第一维表示可取的物品,第二维表示,当前需要达到的目标值。
for(int i = 0; i < n; i++) {//因为是后推前,i+1,所以i<n而不是i<=n
for(int j = 0; j <= t; j++) {
if(stones[i] > j) {//放不下 【如果采用dp[i][j] = dp[i - 1][j],那么i <= n,显然stones[i]会超】
dp[i + 1][j] = dp[i][j];
}else {
dp[i + 1][j] = dp[i][j] || dp[i][j - stones[i]];
}
}
}
最后找到,放入所有物品,能够达到的最接近sum / 2的值,用sum - i*2本题即解
for(int i = t; ; i--) {
if(dp[n][i]) {
return sum - i * 2;
}
}