昨天的腾讯笔试题
第五题,题意大概是这样的
- 第一行输入一个字符串 s,1 <= s.length() <= 400
- 第二行输入该组有多少个测试 n
- 后面n行,每行输入两个数字,l,r用空格分割,l和r分别表示s的子串左右边界,1 <= l <= r <= s.length()
例子:
输入
ababa
4
1 5
2 5
1 4
2 4
输出
1
2
2
1
解释:1 5表示子串为ababa,此时本就为回文,所以最少由一个回文串构成,2 5表示子串为baba,此时可由bab+a构成,也可由b+aba构成,所以输出为2
题解
由于昨天在这道题上浪费了快50min,且未得分,心有不甘,感觉前半部分思路正确,但是后面计算最少组成的时候就脑袋宕机了,故在LeetCode上找了一个类似的题,进行解答,最后通过,便写下该博客。题为:分割回文串 II,给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串,返回符合要求的最少分割次数。所以此题与笔试题是差不多的,在笔试题的返回答案上减1即为该lc题的答案
程序
思路为
- 建立一个boolean[s.length()][s.length()]的dp矩阵
- i表示子串开始位置,j表示子串结束位置,利用矩阵上三角进行处理该子串是否为回文串
- 建立一个同等大小的int矩阵res,也是利用上三角存放该子串最少可由多少个回文串组成
import java.util.Arrays;
public class CycleString {
public static void main(String[] args) {
String s = "ababaccc";
int len = s.length();
boolean[][] dp = new boolean[len][len];
for(int i = len - 1;i >= 0;i--){
dp[i][i] = true;
for (int j = i+1; j < len ; j++) {
if(s.charAt(i) == s.charAt(j)){
dp[i][j] = i == j - 1 || dp[i+1][j-1];
}
}
}
for (boolean[] booleans : dp) {
System.out.println(Arrays.toString(booleans));
}
int[][] res = new