LSC回文字符串
2016-07-08 17:41
337 查看
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子:
abcda
google
输出例子:
2
2
输出需要删除的字符个数
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子:
abcda
输出例子:
2
2
import java.util.Scanner; public class ConstructPlalindrome { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while(scan.hasNext()) { String s = scan.nextLine(); System.out.println(s); int len = lenghOfLCS(s, new StringBuffer(s).reverse().toString()); System.out.println(s.length() - len); } scan.close(); } //动态规划求最长公共子序列的长度 public static int lenghOfLCS(String s1, String s2) { char[] ch1 = s1.toCharArray(); char[] ch2 = s2.toCharArray(); int n1 = s1.length(); int n2 = s2.length(); int[][] table = new int[n1][n2];//所有元素默认初始化为0 if(ch1[0] == ch2[0]) table[0][0] = 1; //单独计算s2与s1首字母之间的的LCS长度 for(int i = 1; i < n2; ++i) { if(ch1[0] == ch2[i]) table[0][i] = 1; else table[0][i] = table[0][i-1]; } //单独计算s1与s2首字母之间的LCS长度 for(int i = 1; i < n1; ++i) { if(ch2[0] == ch1[i]) table[i][0] = 1; else table[i][0] = table[i-1][0]; } //递推求解各个字符处的LCS for(int i = 1; i < n1; ++i) { for(int j = 1; j < n2; ++j) { if(ch1[i] == ch2[j]) { table[i][j] = table[i-1][j-1] + 1; }else table[i][j] = table[i-1][j] > table[i][j-1] ? table[i-1][j] : table[i][j-1]; } } return table[n1-1][n2-1]; } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树