博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
删除部分字符使其变成回文串问题——最长公共子序列LCS问题
阅读量:6608 次
发布时间:2019-06-24

本文共 1721 字,大约阅读时间需要 5 分钟。

hot3.png

先要搞明白:最长公共子串和最长公共子序列的区别。

最长公共子串(Longest Common Substirng):连续

最长公共子序列(Longest Common Subsequence,LCS):不必连续

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

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

思路是:反序这个字符串,求这个新串和原串的最大子序列。abcda--->adcba 最大子序列是aca,再相减就是最少的字符删除个数。所以问题变成了求两个字符串的最长子序列。

那么怎么求两个字符串的最长子序列呢?既然是用动态规划,最重要的是确定状态和状态转移方程。

状态:当str1的下标为m,str2的下标是n的时候(不考虑后面的),此时的最长子序列长度L。

转移方程:1,如果str1(m)==str2(n),那么L(m,n)=L(m-1,n-1)+1。2,如果str1(m)!=str2(n),那么L(m,n)=max(L(m-1,n),L(m,n-1))。

解释一下,假如m和n相等,那么这个时候最长子序列无疑是前一个L(m-1,n-1)加上1,因为这两个字符串这个地方的字符都可以加入到最长子序列里面去。如果不相等,那么要么舍弃新来的来自str1的那个字符m号,要么舍弃str2的n号字符(最长子序列每个位置上当然都是唯一确定的一个字符),舍弃之后呢,就从

L(m-1,n),L(m,n-1)当中挑一个好的(能更长的)为当前状态的最长子序列。

代码:

public class Main {     public static void main(String[] args){         Solution s = new Solution();         Scanner sc = new Scanner(System.in);         while(sc.hasNextLine()) {             System.out.println( s.getResult(sc.nextLine()) );         }         sc.close();     }} class Solution {     public int getResult(String s) {         StringBuilder s1 = new StringBuilder(s);         StringBuilder s2 = new StringBuilder(s).reverse();         return s.length() - LCS(s1, s2);     }     public int LCS(StringBuilder s1, StringBuilder s2) {         int m = s1.length();         int n = s2.length();         int[][] mutrix = new int[m + 1][n + 1];                  for(int i = 1; i <= m; i++) {             for(int j = 1; j <= n; j++) {                 if(s1.charAt(i - 1) == s2.charAt(j - 1))                     mutrix[i][j] = mutrix[i - 1][j - 1] + 1;                 else                      mutrix[i][j] = Math.max(mutrix[i - 1][j], mutrix[i][j - 1]);             }         }         return mutrix[m][n];     }}

 

转载于:https://my.oschina.net/hunglish/blog/745062

你可能感兴趣的文章
【前端笔记】彻底理解变量与函数的声明提升
查看>>
Android 反编译利器,jadx 的高级技巧
查看>>
二叉搜索树(递归实现)
查看>>
Spring Retry重试机制
查看>>
Android官方架构组件LiveData: 观察者模式领域二三事
查看>>
[Android组件化]组件化数据分享
查看>>
你必须知道的HTTP基本概念
查看>>
当下拉列表数据过大时,该如何应对?
查看>>
使用OpenGrok搭建 可搜索可跳转的源码 阅读网站
查看>>
HTML5开发中的javascript闭包
查看>>
Android ContentProvider调用报错"Bad call:..."及相关Binder权限问题分析
查看>>
ionic3 教程(二)登录页制作
查看>>
Python正则表达式初识(四)
查看>>
配置通过VLANIF实现跨设备VLAN内通信
查看>>
Linux-正则表达式
查看>>
基本shell脚本的编辑及变量
查看>>
加密和解密 tar
查看>>
[李景山php]每天TP5-20161216|thinkphp5-helper.php-1
查看>>
VMware、Workstation 使用
查看>>
用户输入和while循环
查看>>