算法奇妙屋(三十八)-贪心算法学习之路 5

文章目录

一. 力扣 409. 最长回文串

1. 题目解析

给定的字符串s, 使用s中的字符, 来构建最长的回文串, 这里字符不必全部使用

2. 算法原理

这里有两个小技巧👇
1. 这里我们可以使用当前字符个数m / 2 后再✖️2, 这样无论m奇偶, 可以得到偶数的长度
2. 用最后ret长度与原长度比较, 来判断是否有奇数字符

3. 代码

使用哈希表

java 复制代码
class Solution {
    public int longestPalindrome(String s) {
        HashMap<Character, Integer> hash = new HashMap<>();
        int n = s.length(), ret = 0;
        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            hash.put(ch, hash.getOrDefault(ch, 0) + 1);
        }
        for (Map.Entry<Character, Integer> entry : hash.entrySet()) {
            ret += entry.getValue() / 2 * 2;
        }
        return ret == n ? ret : ret + 1;
    }
}

使用数组模拟哈希表, 效率更高, 且空间利用率更低

java 复制代码
class Solution {
    public int longestPalindrome(String s) {
        int[] hash = new int[127];
        int n = s.length(), ret = 0;
        for (int i = 0; i < n; i++) {
            hash[s.charAt(i)]++;
        }
        for (int x : hash) {
            ret += x / 2 * 2;
        }
        return ret == n ? ret : ret + 1;
    }
}

二. 力扣 942. 增减字符串匹配

1. 题目解析

这道题理解题意很重要, 要注意是0到n, 总共n+1个数

2. 算法原理

升序时, 当前位置选最小值, 那么后一个位置不论选什么必定都大于该值
降序时, 当前位置选最大值, 那么后一个位置不论选什么必定都小于该值

相关推荐
智慧物业老杨31 分钟前
物业日常巡查的数智化重构:从“打卡式巡检“到“闭环式风控“
android·java·人工智能·系统架构·rxjava
晴天的雨.9921 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
M78佐菲6 小时前
ARM学习笔记(1)
linux·arm开发·笔记·嵌入式硬件·学习
步行cgn7 小时前
Spring c 命名空间注入详解
java·后端·spring
明月_清风7 小时前
Maven 到底是什么?一篇文章搞懂 Java 项目构建与依赖管理
java·后端·maven
aramae8 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
Rain的Java大神之路8 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
荆棘鸟智能8 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
无敌贵点大王9 小时前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
Wang's Blog9 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis