两个回文子序列长度的最大乘积
题目条件
给你一个字符串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;
}
};

浙公网安备 33010602011771号