POJ 1159题意:
回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。现在的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。比如:“Ab3bd”插入2个字符后可以变成回文词“dAb3bAd”或“Adb3bdA”,但是插入少于2个的字符无法变成回文词。
[输入]:
第一行:字符串的长度N(3 <= N <= 5000)
第二行:需变成回文词的字符串
[输出]:
将给定字符串变成回文词所需要插入的最少字符数
[样例]:
Sample Input
5
Ab3bd
Sample Output
2
分析:
S和S' (注:S'是S的反串)的最长公共子串其实一定是回文的。这样我们就可以借助lcs来解决该题,即用s的长度减去lcs的值即可。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader (System.in));
int total = Integer.parseInt(in.readLine());
String string = in.readLine();
System.out.println(total-LCS(string,new StringBuffer(string).reverse().toString()));
}
//返回两个string的lcs的长度
public static int LCS(String str1,String str2){
short length1 = (short)str1.length();
short length2 = (short)str2.length();
short[][]result = new short [2][length2+1]; //滚动数组,节省空间
for(int i=1;i<=length1;i++){
for(int j=1;j<=length2;j++){
if(str1.charAt(i-1)==str2.charAt(j-1))
result[i%2][j] = (short)(result[(i-1)%2][j-1]+1);
else
result[i%2][j] = result[(i-1)%2][j]>result[i%2][j-1]?result[(i-1)%2][j]:result[i%2][j-1];
}
}
return result[length1%2][length2];
}
}
源码:
分享到:
相关推荐
【描述】虽然描述部分为空,但我们可以推测,作者在博客中可能详细解释了树状数组的概念、特性以及其在解决实际问题中的应用。通常,这样的文章会包含以下几个方面: 1. **树状数组定义**:树状数组是一种高效的...
在这个问题中,我们通过分析POJ 3067的题目来探讨如何应用树状数组解决实际问题。 POJ 3067题目大致是这样的:给定一个数组,我们需要在数组上进行一系列的查询和修改操作。查询操作询问区间内元素之和,而修改操作...
【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...
标题“大顶堆应用:POJ2010”指的是一个关于大顶堆算法在解决实际问题中的应用,特别是针对编程竞赛网站POJ(Programming Online Judge)上的问题2010。大顶堆是一种特殊的完全二叉树,其每个节点的值都大于或等于其...
北大POJ1159-Palindrome