news 2026/6/10 17:55:07

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

作者头像

张小明

前端开发工程师

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/6/6 6:59:30

大模型面试题59:vLLM使用TP时MHA head数非GPU整数倍的解决方案?

要搞懂这个问题,我们先理清两个核心概念的关系:张量并行(TP) 是vLLM把大模型拆到多张GPU上跑的技术,多头注意力(MHA)的head 是注意力机制的独立计算单元——TP对MHA的最优拆分方式是「按head均分」,这也是性能最高的方案。 当 head 数量不是 GPU 数量的整数倍时,核心…

作者头像 李华
网站建设 2026/6/1 2:03:32

Vite vs Webpack:开发效率对比实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请创建两个功能完全相同的React项目进行对比&#xff1a;1. 使用Vite创建 2. 使用Create React App创建。项目功能要求&#xff1a;包含3个页面&#xff0c;使用React Router导航&…

作者头像 李华
网站建设 2026/6/10 11:40:20

WebView2 Runtime vs传统浏览器嵌入:效率对比分析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个性能对比工具&#xff0c;量化分析WebView2 Runtime与传统浏览器嵌入(如CEF)在以下方面的差异&#xff1a;1) 启动时间&#xff0c;2) 内存占用&#xff0c;3) 渲染性能&a…

作者头像 李华
网站建设 2026/6/10 11:38:00

Qwen3-VL-WEBUI建筑图纸解析:CAD转描述部署应用

Qwen3-VL-WEBUI建筑图纸解析&#xff1a;CAD转描述部署应用 1. 引言&#xff1a;为何需要AI驱动的CAD图纸理解&#xff1f; 在建筑设计、施工管理与工程审计等实际业务场景中&#xff0c;海量的CAD图纸&#xff08;如DWG、DXF格式&#xff09;构成了项目的核心资产。然而&…

作者头像 李华
网站建设 2026/6/10 11:37:25

SORA V2官网开发效率提升300%的秘密

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个官网开发效率对比工具&#xff1a;1. 传统开发流程模拟器&#xff0c;展示各环节耗时 2. SORA V2开发流程可视化 3. 自动生成效率对比报告 4. 包含代码量、开发时间、人力…

作者头像 李华
网站建设 2026/6/10 11:44:15

TOKEN解析效率革命:AI工具VS传统方法对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个高性能TOKEN解析对比工具&#xff0c;要求&#xff1a;1. 同时展示传统解析和AI解析两种方式 2. 统计并对比两者的解析时间 3. 支持批量TOKEN解析 4. 生成解析效率对比图表…

作者头像 李华