牛客网算法之动态规则

最近几天一直在牛客网上进行算法试题测试,在博客做下简单的记录。

原题地址

侵权删

题目:构造回文

题目简介:

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?

输出需要删除的字符个数。

输入描述:
1
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
1
对于每组数据,输出一个整数,代表最少需要删除的字符个数。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s1 = sc.next();
String s2 = new StringBuilder(s1).reverse().toString();
int[][] dp = new int[s1.length() + 1][s2.length() + 1];
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[0].length; j++) {
dp[i][j] = s1.charAt(i - 1) == s2.charAt(j - 1) ? dp[i - 1][j - 1] + 1 : Math
.max(dp[i - 1][j], dp[i][j - 1]);
//System.out.println(i + ":" + dp[i][j]);
}
}
System.out.println(s1.length() - dp[s1.length()][s2.length()]);
}
}
}

代码说明:

具体采用动态规则进行计算,原题目网中有大神进行了阐述,如下:

提到回文串,自然要利用回文串的特点,想到将源字符串逆转后,“回文串”(不一定连续)相当于顺序没变求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划很容易求得),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小编辑长度。(侵权删)

动态规则还有很多类似的算法,需要再接再厉!进行深一层次的学习。