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

Leetcode 2002.两个回文子序列长度的最大乘积

题目条件

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

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

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

题解

二进制状态压缩算法挨个查找子串,判断是否满足条件即可。

class Solution {
public:
    int maxProduct(string s) {
        vector <bool> isnice(1 << s.size());
        vector <int> len(1 << s.size());
        //枚举每个子集,状态压缩,二进制,位运算。
        for(int i = 1;i < (1 << s.size());i++){
            bool flag = true;
            int l = 0 , r = s.size()-1;
            while(l < r){
                while(l < r && !(i & (1 << l))) l++;
                while(l < r && !(i & (1 << r))) r--;
                if(s[l] != s[r]){
                    isnice[i] = false;
                    flag = false;
                    break;
                }
                l++;
                r--;
            }
            if(flag){
                isnice[i] = true;
                len[i] = __builtin_popcount(i);//统计1的个数
            }
        }
        int ans = 0;
        for(int i = 1;i < (1 << s.size());i++){
            for(int j = i+1;j < (1 << s.size());j++){
                if(!(i & j) && isnice[i] && isnice[j])
                    ans = max(ans,len[i]*len[j]);
            }
        }
        return ans;
    }
};
posted @ 2021-10-28 04:16  Chilyyy  阅读(64)  评论(0)    收藏  举报