<p>Given a string <code>s</code>, find two <strong>disjoint palindromic subsequences</strong> of <code>s</code> such that the <strong>product</strong> of their lengths is <strong>maximized</strong>. The two subsequences are <strong>disjoint</strong> if they do not both pick a character at the same index.</p>

<p>Return <em>the <strong>maximum</strong> possible <strong>product</strong> of the lengths of the two palindromic subsequences</em>.</p>

<p>A <strong>subsequence</strong> is a string that can be derived from another string by deleting some or no characters without changing the order of the remaining characters. A string is <strong>palindromic</strong> if it reads the same forward and backward.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="example-1" src="https://assets.leetcode.com/uploads/2021/08/24/two-palindromic-subsequences.png" style="width: 550px; height: 124px;" />
<pre>
<strong>Input:</strong> s = &quot;leetcodecom&quot;
<strong>Output:</strong> 9
<strong>Explanation</strong>: An optimal solution is to choose &quot;ete&quot; for the 1<sup>st</sup> subsequence and &quot;cdc&quot; for the 2<sup>nd</sup> subsequence.
The product of their lengths is: 3 * 3 = 9.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;bb&quot;
<strong>Output:</strong> 1
<strong>Explanation</strong>: An optimal solution is to choose &quot;b&quot; (the first character) for the 1<sup>st</sup> subsequence and &quot;b&quot; (the second character) for the 2<sup>nd</sup> subsequence.
The product of their lengths is: 1 * 1 = 1.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;accbcaxxcxx&quot;
<strong>Output:</strong> 25
<strong>Explanation</strong>: An optimal solution is to choose &quot;accca&quot; for the 1<sup>st</sup> subsequence and &quot;xxcxx&quot; for the 2<sup>nd</sup> subsequence.
The product of their lengths is: 5 * 5 = 25.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>2 &lt;= s.length &lt;= 12</code></li>
	<li><code>s</code> consists of lowercase English letters only.</li>
</ul>

class Solution:
    # DP, O(P^2) time where P is # of palindromes, O(1) space
    def maxProduct(self, s: str) -> int:
        bmSize = len(s)
        pals = []
        palBits = []

        # O(1) capped at 12
        def isPalindrome(s: str, bm: int) -> bool:
            tmp = ''
            for i in range(bmSize):
                if (bm >> i) & 1:
                    tmp = s[i] + tmp
            
            # trim search space by ignoring length 1 palindromes
            if len(tmp) == 1:
                return False
            return tmp == tmp[::-1]

        # O(1) capped at 12
        def num1Bits(bm: int) -> int:
            tmp = 0
            for i in range(bmSize):
                if (bm >> i) & 1:
                    tmp += 1
            return tmp
            
        for i in range(2**bmSize): # capped at 2^12, O(1)
            if isPalindrome(s, i):
                pals.append(i)
                palBits.append(num1Bits(i))
        
        maxProd = 1
        for j in range(len(pals)):
            for k in range(j+1, len(pals)):
                if pals[j] & pals[k] == 0:
                    maxProd = max(maxProd, palBits[j] * palBits[k])
            # pair palindrome with one letter if possible
            if palBits[j] != len(s): 
                maxProd = max(maxProd, palBits[j])
        return maxProd
965