Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 52543 | Accepted: 18113 |
Description
As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
Source
import java.util.Arrays; import java.util.Scanner; public class POJ1159_ieayoio { static String s; public static void main(String[] args) { Scanner cin = new Scanner(System.in); while (cin.hasNext()) { int le = cin.nextInt(); s = cin.next(); short[][] f = new short[le + 5][le + 5]; for (int i = 0; i < f.length; i++) { Arrays.fill(f[i], (short) 0); } for (int i = 1; i <= le; i++) { f[0][i] = (short) (le - i + 1); } for (int i = 1; i <= le; i++) { f[i][le + 1] = (short) i; } for (int i = 1; i <= le; i++) for (int j = le; j >= i; j--) { if (s(i) == s(j)) f[i][j] = f[i - 1][j + 1]; else { f[i][j] = (short) Math.min(f[i - 1][j] + 1, f[i][j + 1] + 1); } } int min = Integer.MAX_VALUE; for (int i = 1; i <= le - 1; i++) { if (min > f[i][i + 1]) min = f[i][i + 1]; } for (int i = 1; i <= le; i++) { if (min > f[i][i]) min = f[i][i]; } System.out.println(min); } } static char s(int i) { return s.charAt(i - 1); } }
题目大意:求一个字符串最少加入几个字符能够变成回文串
我的思路就是f[i][j]表示左端数第i个字符,左端数在i右端的第j个字符。只是我開始仅仅是认为和最长公共子序列非常像。没想到还有一种方法就是求这个字符串和它逆串的最长公共子序列,然后再用总长度减去最长公共子序列的长度即为所求