本篇内容介绍了“如何编写代码实现一个字符串的最长回文子序列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
import java.util.Arrays;
/**
* @author pxu
* @create 2021/4/7-5:57 下午
*/
public class Nc154 {
public int longestPalindromeSubSeq (String s) {
int n = s.length();
/**
* 在for循环运行过程中,dp[j]中的数据代表s从i到j的子串中的最长回文序列的长度
* 在for运行结束后,dp[j]中的数据代表s从0到j的子串中的最长回文序列的长度,所
* 以程序最后返回的结果就是dp[n-1]的值。
*/
int[] dp = new int[n];
/**
* 填充为1的原因是,每一个字符都是一个长度为1的回文串
*/
Arrays.fill(dp,1);
for (int i = n-2;i>=0;i--) {
/**
* pre总是代表在字符串s从i+1到j-1的子串的最长的回文序列的长度,所以其初始值被设置为0
*/
int pre=0;
for (int j=i+1;j<n;j++) {
/**
* 因为第i个字符可能会和第j个字符结合成回文对,导致原有dp[j]_old的值变为在dp[j-1]基础上
* 增加2形成新的dp[j]_new,但是如果第i个字符也可以和第j+1个字符结合成回文对,这时候
* 对于第j+1个字符来说,第j个字符是没有和第i个字符结合的(因为第i个字符,只能和后面的一个字符结合)
* ,所以dp[j+1]的新值应该是dp[j]的旧值的基础上增加2得到。所以每次进入循环的时候需要把dp[j]的值
* 记录在temp变量中,在本次循环结束之前,将值传递给pre,以便于在下一次循环中如果下一个字符也可以
* 和第i个字符结合时,更新dp中的值
*/
int temp = dp[j];
if (s.charAt(i) == s.charAt(j)) {
dp[j] = pre + 2;
}else {
dp[j] = Math.max(dp[j],dp[j-1]);
}
pre = temp;
}
}
return dp[n-1];
}
}
“如何编写代码实现一个字符串的最长回文子序列”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4489002/blog/5011740