Java教程

两个回文子序列长度的最大乘积--java

本文主要是介绍两个回文子序列长度的最大乘积--java,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

给你一个字符串 s ,请你找到 s 中两个 不相交回文子序列 ,使得它们长度的 乘积最大 。两个子序列在原字符串中如果没有任何相同下标的字符,则它们是 不相交 的。

请你返回两个回文子序列长度可以达到的 最大乘积 。

子序列 指的是从原字符串中删除若干个字符(可以一个也不删除)后,剩余字符不改变顺序而得到的结果。如果一个字符串从前往后读和从后往前读一模一样,那么这个字符串是一个 回文字符串 。

示例 1:

输入:s = "leetcodecom"
输出:9
解释:最优方案是选择 "ete" 作为第一个子序列,"cdc" 作为第二个子序列。
它们的乘积为 3 * 3 = 9 。
示例 2:

输入:s = "bb"
输出:1
解释:最优方案为选择 "b" (第一个字符)作为第一个子序列,"b" (第二个字符)作为第二个子序列。
它们的乘积为 1 * 1 = 1 。
示例 3:

输入:s = "accbcaxxcxx"
输出:25
解释:最优方案为选择 "accca" 作为第一个子序列,"xxcxx" 作为第二个子序列。
它们的乘积为 5 * 5 = 25 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-of-the-length-of-two-palindromic-subsequences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    int cnt = 0;    //记录回文乘积

    public int maxProduct(String s) {
        String s1 = new String();
        String s2 = new String();
        dfs(s,s1,s2,0);
        return cnt; //返回回文乘积
    }

    void dfs(String s , String s1 ,String s2 ,int index){
        if(check(s1) && check(s2)) 
            cnt = Math.max(cnt , s1.length() * s2.length()  ); //把最大的回文乘积给到cut
        if(index == s.length()) return; //排除特殊情况
        dfs(s ,s1 + s.charAt(index) ,s2 , index + 1 );  //递归使用check函数找到s1的回文
        dfs(s ,s1 ,s2 + s.charAt(index) , index + 1 );  //递归使用check函数找到s2的回文
        dfs(s ,s1 ,s2 , index + 1 );
    }
    boolean check(String s){    //判断是否回文,找到回文的字符串
        int l = 0 ,r = s.length() - 1;
        while(l<r){
            if(s.charAt(l) != s.charAt(r)){     //不是回文结束
                return false;
            } 
            l++;
            r--;
        }
        return true;
    }
}
这篇关于两个回文子序列长度的最大乘积--java的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!