其他分享
首页 > 其他分享> > 两个回文子序列长度的最大乘积

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

作者:互联网

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);
            }
        }
        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;
    }
};

题外话

记录一下小宋老师。
有的夜空寂寥几颗星,有的夜风灌不进十指相扣。有的人散步聊天,有的人在约会时讲解状态压缩算法,并且让他弱小可怜的女朋友写完这道题再回去。那当然是……让宋某的女朋友的男朋友写啊!
所以这段代码其实是小宋老师写ovo。
不过霖某人直接手打专属家教宋某写的题解也不是一回两回的事儿了啊喂

标签:乘积,字符串,序列,长度,压缩算法,回文
来源: https://www.cnblogs.com/chilyyy/p/15473780.html