news 2026/6/4 22:39:45

一次遍历+维护前后缀+枚举中间+位运算

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一次遍历+维护前后缀+枚举中间+位运算

lc2484

前缀、后缀数组分别统计数字对的出现次数,枚举字符串中间字符

累加前后缀相同数字对的乘积,得到长度为5的回文子序列总数。

class Solution {
const long MOD = 1e9 + 7;
public:
int countPalindromes(string s) {
int suf[10]{}, suf2[10][10]{}, pre[10]{}, pre2[10][10]{};
for (int i = s.length() - 1; i >= 0; --i) {
char d = s[i] - '0';
for (int j = 0; j < 10; ++j)
suf2[d][j] += suf[j];
++suf[d]; //预处理后缀
}

long ans = 0L;
for (char d : s) {
d -= '0';
--suf[d];
for (int j = 0; j < 10; ++j)
suf2[d][j] -= suf[j]; // 撤销


for (int j = 0; j < 10; ++j)
for (int k = 0; k < 10; ++k)
ans += (long) pre2[j][k] * suf2[j][k]; // 枚举所有字符组合


for (int j = 0; j < 10; ++j)
pre2[d][j] += pre[j];
++pre[d];

}
return ans % MOD;
}
};

lc1930

unordered_map<char, pair<int, int>> hash;算起止

class Solution {
public:
int countPalindromicSubsequence(string s)
{
int n = s.size();
unordered_map<char, pair<int, int>> hash;
for (int i = 0; i < n; ++i)
{
if (!hash.count(s[i]))
hash[s[i]].first = i;
hash[s[i]].second = i;
}
int ret = 0;
for (auto& [ch, pos] : hash) {
int first = pos.first;
int last = pos.second;
if (last - first < 2) continue; // 中间没有字符,无法形成长度为3的回文
unordered_set<char> st;
for (int i = first + 1; i < last; ++i)
st.insert(s[i]);
ret += st.size();
}
return ret;
}
};

优化

一次遍历+维护前后缀+枚举中间+位运算

前缀后缀二进制标记字符存在性

枚举字符串中间字符作为回文中心

has[mid] |= pre & suf;

累加得到长度为3的回文子序列总数

for (int mask : has)
ans += popcount((uint32_t) mask);

算法就是 一次遍历 不断维护

class Solution {
public:
int countPalindromicSubsequence(string s) {
int n = s.size();
// 统计 [1,n-1] 每个字母的个数
int suf_cnt[26]{};
int suf = 0;
for (int i = 1; i < n; i++) {
int ch = s[i] - 'a';
suf_cnt[ch]++;
suf |= 1 << ch; // 把 ch 记录到二进制数 suf 中,表示后缀有 ch
}

int pre = 0;
int has[26]{}; // has[mid] = 由 alpha 组成的二进制数
for (int i = 1; i < n - 1; i++) { // 枚举中间字母 mid
int mid = s[i] - 'a';
suf_cnt[mid]--;

// 撤销 mid 的计数,suf_cnt 剩下的就是后缀 [i+1,n-1] 每个字母的个数
if (suf_cnt[mid] == 0)

// 后缀 [i+1,n-1] 不包含 mid
suf ^= 1 << mid;

// 从 suf 中去掉 mid

pre |= 1 << (s[i - 1] - 'a');

// 把 s[i-1] 记录到二进制数 pre 中,表示前缀有 s[i-1]
has[mid] |= pre & suf;

// 计算 pre 和 suf 的交集,|= 表示把交集中的字母加到 has[mid] 中
}

int ans = 0;
for (int mask : has) {
ans += popcount((uint32_t) mask);

//每个字符 has一个的记录表

// mask 中的每个 1 对应着一个 alpha
}
return ans;
}
};

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 19:26:09

微信小程序的智慧校园服务平台的设计与实现_btclir47

文章目录微信小程序智慧校园服务平台的设计与实现主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;微信小程序智慧校园服务平台的设计与实现 微信小程序智慧…

作者头像 李华
网站建设 2026/5/30 20:14:42

AI智能实体侦测服务备份恢复:数据持久化存储实战方案

AI智能实体侦测服务备份恢复&#xff1a;数据持久化存储实战方案 1. 引言 1.1 业务场景描述 在当前自然语言处理&#xff08;NLP&#xff09;应用日益普及的背景下&#xff0c;AI 智能实体侦测服务已成为信息抽取、知识图谱构建和内容审核等系统的核心组件。以新闻分析、舆情…

作者头像 李华
网站建设 2026/5/30 20:16:04

Qwen3-VL票据识别:财务自动化处理案例

Qwen3-VL票据识别&#xff1a;财务自动化处理案例 1. 引言&#xff1a;财务自动化中的视觉语言模型需求 在企业财务流程中&#xff0c;票据识别是高频且重复性极高的任务。传统OCR技术虽能提取文本&#xff0c;但在结构化理解、语义推理和复杂布局解析方面存在明显短板。例如…

作者头像 李华
网站建设 2026/5/29 19:53:09

Qwen3-VL-WEBUI功能实测:名人与地标识别覆盖广度验证

Qwen3-VL-WEBUI功能实测&#xff1a;名人与地标识别覆盖广度验证 1. 引言 随着多模态大模型的快速发展&#xff0c;视觉-语言理解能力已成为衡量AI系统智能水平的重要指标。在这一背景下&#xff0c;阿里云推出的 Qwen3-VL-WEBUI 提供了一个直观、高效的交互平台&#xff0c;…

作者头像 李华
网站建设 2026/5/29 2:03:07

AI如何帮你解决Git分支冲突问题

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个AI辅助工具&#xff0c;能够自动检测Git分支冲突&#xff0c;并提供解决方案。工具应能分析当前分支与远程分支的差异&#xff0c;识别冲突文件&#xff0c;并给出合并建议…

作者头像 李华
网站建设 2026/5/29 20:31:38

1小时打造中国区域经济数据原型系统

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个中国区域经济数据原型系统。核心功能&#xff1a;1) 中国地图展示各省经济指标&#xff1b;2) 多维度数据对比(GDP、人均收入、增长率等)&#xff1b;3) 时间轴查看历…

作者头像 李华