极限过题,最后30s才debug出来,真滴菜。
思路:按照题目要求来即可,一个小坑点是删除了两个字符后原本不相邻的字符变得相邻,因此需要注意一下。
class Solution {
public String makeGood(String s) {
int len = s.length();
Stack<Character> st = new Stack<>();
StringBuilder str = new StringBuilder();
for (int i = 0; i < len; i++) {
if (st.isEmpty()) st.add(s.charAt(i));
else {
if (s.charAt(i) - st.peek() == -32 || s.charAt(i) - st.peek() == 32)
st.pop();
else
st.add(s.charAt(i));
}
}
while (!st.isEmpty())
str.append(st.pop());
return str.reverse().toString();
}
}
思路:暴力操作即可,因为串的长度不会超过20的。
class Solution {
public char findKthBit(int n, int k) {
int now = 1;
StringBuilder str = new StringBuilder("0");
while (now < k) {
int len=str.length();
StringBuilder s=new StringBuilder();
for (int i = 0; i < len; i++) {
if (str.charAt(i) == '0')
s.append("1");
else
s.append("0");
}
str.append("1");
str.append(s.reverse().toString());
now += 1 + len;
}
return str.charAt(k - 1);
}
}
思路:简单dp(贪心),通过前缀和我们能够得到以该点结尾能否组成子数组的和为target,之后我们将最优解迭代过来即可。
class Solution {
public int maxNonOverlapping(int[] nums, int target) {
int n = nums.length;
int[] dp = new int[n + 1];
Map<Long, Integer> map = new HashMap<>();
map.put(0L, 0);
long sum = 0;
for (int i = 1; i <= n; i++) {
sum += nums[i - 1];
dp[i] = dp[i - 1];
if (map.containsKey(sum - target))
dp[i] = Math.max(dp[i], dp[map.get(sum - target)] + 1);
map.put(sum, i);
}
return dp[n];
}
}
思路:区间dp的思想求解,我们将问题转化为若干个不同长度的块,每次合并两个块的价值为两个块的长度之和,问你最后组成一个块的最小价值是多少?妥妥的区间dp模板题啊,直接上代码啦。
class Solution {
public int minCost(int n, int[] cuts) {
int ans = 0;
int m = cuts.length;
int[][] dp = new int[m + 1][m + 1];
int[] arr = new int[m];
int[] sum = new int[m + 1];
Arrays.sort(cuts);
sum[0] = arr[0] = cuts[0];
for (int i = 1; i < m; i++) {
arr[i] = cuts[i] - cuts[i - 1];
sum[i] = sum[i - 1] + arr[i];
}
sum[m] = sum[m - 1] +n - cuts[m - 1];
m++;
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
dp[i][j] = 100000000;
for (int i = 0; i < m; i++)
dp[i][i] = 0;
for (int len = 1; len <= m; len++)
for (int i = 0; i + len - 1 < m; i++) {
int j = i + len - 1;
int val = sum[j];
if (i > 0) val -= sum[i - 1];
for (int k = i; k < j; k++) {
dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k + 1][j] + val);
//System.out.println(i + " " + j + " " + dp[i][j]);
}
}
return dp[0][m - 1];
}
}