【Leetcode】1930. 长度为 3 的不同回文子序列

这一题题目不难理解,就是在字符串中寻找有多少个独一无二的回文,只不过这个回文可以不相邻,而且长度只有3。固定首尾,然后再确定中间的字符,加一个去重即可(Set)。

时间复杂度过大,n的3次方

这里的思路比较耿直,直接用3层循环来做
i来寻找首,j来寻找尾,k在中间进行累加即可

最后利用set来进行去重

只不过这里不能ac,时间复杂度过大。

js 复制代码
var countPalindromicSubsequence = function (s) {
    let set = new Set();
    for (let i = 0; i < s.length; ++i) {
        for (let j = s.length - 1; j > i + 1; --j) {
            if (s[i] === s[j]) {
                for (let k = i + 1; k < j; ++k) {
                    set.add(s[i] + s[k] + s[j]);
                }
            }
        }
    }
    return set.size
};

ac

这个解法时间复杂度就是n,准确来说是26*n,存在常数,即O(n)

寻找每个字符首次出现的位置,还有最后一次出现的位置

如果这两个位置的字符索引不相等,那么就可以形成回文

js 复制代码
var countPalindromicSubsequence = function (s) {
    const firstIndex = new Array(26).fill(-1)
    const lastIndex = new Array(26).fill(-1)
    for(let i = 0; i < s.length; ++i){
        const charCode = s.charCodeAt(i) - 'a'.charCodeAt(0)
        if(firstIndex[charCode] === -1){
            firstIndex[charCode] = i
        }
        lastIndex[charCode] = i
    }
    let sum = 0
    for(let i = 0; i < 26; ++i){
        let first = firstIndex[i]
        let last = lastIndex[i]
        if(first == last) continue
        let charSet = new Set()
        for(let j = first + 1; j < last; ++j){
            charSet.add(s[j])
        }
        sum += charSet.size
    }
    return sum
};
相关推荐
超级码力6661 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑1 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
matlab_xiaowang2 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
Merlos_wind2 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师2 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
前端摸鱼匠3 小时前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker4 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
Yzzz-F5 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业5 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn5 小时前
Java Set集合相关知识点
java·开发语言·算法