LeetCode最长回文串使用JavaScript解题|前端学算法

简介: LeetCode最长回文串使用JavaScript解题|前端学算法

最长回文串


给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串长度。

在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。

示例 1:

输入:s = "abccccdd"

输出:7

解释:

我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

示例 2:

输入:s = "a"

输入:1

什么是回文串?

正着读和反着读都相同的字符串序列就称为“回文串”,是一个对称的字符串比如说:abba,abcdcba


解题思路



回文串可以分为两类,第一类就是奇数个字符的回文串,除了中间字符以外,其他字符镜面对称,比如aba;第二类就是偶数个回文串:所有的字符全都镜面堆成,比如abba

简单的来说,(有可能除去一个字母外)其他的字母都出现偶数次,

所以此时我们需要统计每个字符出现的次数,可以用哈希表来统计

具体步骤可参考如下:

  • 第一步:创建变量maxLength记录回文串的长度,odd是否有奇数个的字符,strMap用于存储每个字符的数量
  • 第二步:遍历字符串,如果哈希表strMap里没有当前字符则当前字符变成key,且值加一;如果有存在当前字符,则值自加一
  • 第三步:遍历strMap,给当前字符取模(strMap[key] % 2);如果值为0则表明当前字符是偶数个,长度加上当前字符的个数;如果值不是0则表明当前字符有奇数个,有可能是1个也有可能是3个或者5、7、9个,所以可以用此字符长度-1,来说明可以有几个加入到回文串中,并且让odd为true
  • 第四步:判断odd是否为true,如果不是true,那么说明字符串中都是偶数个,最大的长度就是maxLength;如果是true,说明有奇数个,可以再回文串中再加入一个字符,最终长度变为 maxLength+1
var longestPalindrome = function(s) {
    let maxLength = 0; // 计算长度
    let odd = false; // 是否含有奇数个
    let strMap = {};
    for(let i=0;i<s.length;i++){
        if(s[i] in strMap){
            strMap[s[i]] += 1;
        } else {
            strMap[s[i]] = 1;
        }
    }
    for(let key in strMap) {
        if(strMap[key] % 2 === 0) {
            maxLength += strMap[key];
        } else {
            odd = true;
            // 有个能是大于1的奇数个字符
            maxLength += strMap[key]-1;
        }
    }
    if(odd) {
        maxLength+=1;
    }
    return maxLength;
};


image.png


知识点


  • for...of 以任意顺序迭代一个对象的除Symbol以外的可枚举属性
var obj = {a:1, b:2, c:3};
for (let key in obj) {
  console.log("键---值:",key,obj[key]);
  console.log();
}
// Output:
// 键---值: a 1
// 键---值: b 2
// 键---值: c 3


目录
相关文章
|
4天前
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
|
29天前
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
60 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
12天前
|
设计模式 前端开发 JavaScript
揭秘!前端大牛们如何巧妙利用JavaScript,打造智能交互体验!
【10月更文挑战第30天】前端开发领域充满了无限可能与创意,JavaScript作为核心语言,凭借强大的功能和灵活性,成为打造智能交互体验的重要工具。本文介绍前端大牛如何利用JavaScript实现平滑滚动、复杂动画、实时数据更新和智能表单验证等效果,展示了JavaScript的多样性和强大能力。
30 4
|
7天前
|
前端开发 JavaScript 安全
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第7天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤。包括项目准备、安装 `javascript-obfuscator`、配置 Vite 构建以应用混淆,以及最终构建项目进行混淆。通过这些步骤,可以有效提升前端代码的安全性,防止被他人轻易分析和盗用。
|
30天前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
137 0
|
30天前
|
前端开发 JavaScript 程序员
【从前端入门到全栈】Node.js 之核心概念
【从前端入门到全栈】Node.js 之核心概念
|
1月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
65 0
|
1月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
9天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。