####【题目描述】

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。注意:
假设字符串的长度不会超过 1010。示例 1:输入:
"abccccdd"输出:
7

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

贪心

class Solution {public int longestPalindrome(String s) {int[] count = new int[128];for (char c: s.toCharArray())count[c]++;int ans = 0;for (int v: count) {ans += v / 2 * 2;if (v % 2 == 1 && ans % 2 == 0)ans++;}return ans;}
}
int数组实现
class Solution {public int longestPalindrome(String s) {int[] cnt = new int[58];for (char c : s.toCharArray()) {cnt[c - 'A'] += 1;}int ans = 0;for (int x: cnt) {// 字符出现的次数最多用偶数次。
//如果 x 是奇数,x & 1 的结果就是1,偶数就是0,实现了偶数不变、奇数减1的逻辑
// (x >> 1) << 1 ,先右移一位去掉最末位的0或1,再左移一位,也实现了偶数不变、奇数减1的逻辑。ans += x - (x & 1);}// 如果最终的长度小于原字符串的长度,说明里面某个字符出现了奇数次,那么那个字符可以放在回文串的中间,所以额外再加一。return ans < s.length() ? ans + 1 : ans;  }
}
Java8的流式风格
class Solution {public int longestPalindrome(String s) {
//s.chars()的返回值是一个 IntStream,就是Int的流;.boxed()会装箱返回Stream<Integer>;.collect()是聚合的算子,Collectors.toMap的三个参数分别是 keyMapper,valueMapper 和 mergeFunction。分别表示聚合出来的 Map 的 key 是什么,value 是什么,如果遇到key相同的,怎么合并值。
//Map<Integer, Integer> count = s.chars().boxed().collect(Collectors.toMap(k -> k, v -> 1, Integer::sum));
// counter.values() 返回的是map值的集合Collection<Integer>,先用.stream()转成流以后,利用mapToInt 转成 IntStream,因为 IntStream 是支持 sum 算子的,通过sum算子进行求和。int ans = count.values().stream().mapToInt(i -> i - (i & 1)).sum();return ans < s.length() ? ans + 1 : ans;}
}
Hashmap
class Solution {public int longestPalindrome(String s) {if (s == null) return 0;Map<Character, Integer> map = new HashMap<>();for (int i = 0; i < s.length(); i++){if (map.containsKey(s.charAt(i))){map.replace(s.charAt(i), map.get(s.charAt(i)) + 1);} else {map.put(s.charAt(i), 1);}}int result = 0;for (Map.Entry<Character, Integer> entry : map.entrySet()){if (entry.getValue() % 2 == 0) {result += entry.getValue();} else {result += entry.getValue() - 1;}}if (result < s.length()) result++;return result;}
}

####【总结】

  1. 取模运算转化(正数)
  • 取模是一个消耗较大的操作,因此大多数语言的编译器比如C++都对模运算进行了优化
  • Java中是不存在无符号整型的,数字是用补码来表示的(最高位是符号位,0表示正数,1表示负数)
//正数能优化 负数不能优化
int a = -3 % 2; // -1
int b = -3 & 1; // 1
x = 87;
x % 2 = x & (2 - 1) = 1010111 & 1 = 1 = 1;
x % 4 = x & (4 - 1) = 1010111 & 11 = 11 = 3;
x % 8 = x & (8 - 1) = 1010111 & 111 = 111 = 7;
x % 16 = x & (16 - 1) = 1010111 & 1111 = 111 = 7;
x % 32 = x & (32 - 1) = 1010111 & 11111 = 10111 = 2
  1. 一题多解,多思考,不要总想遍历,否则很难进步

资料参考整理来自:https://mp.weixin.qq.com/s/HtDYSfaikwHozUrksU0A1w

[leedcode][409][java]相关推荐

  1. 在Dubbo中使用高效的Java序列化(Kryo和FST)

    作者:沈理 文档版权: Apache 2.0许可证 署名-禁止演绎 完善中-- TODO 生成可点击的目录 目录 序列化漫谈 启用Kryo和FST 注册被序列化类 无参构造函数和Serializabl ...

  2. java profile cpu_Java进程高CPU使用调查方法简介

    介绍 关于java进程占用cpu问题,一般都是想知道 哪个(些)线程使用了更多的cpu 哪个(些)方法使用了更多的cpu 本文给出一个非常简要的介绍并给出了各个方法的使用例子,更深入使用可参考相关文档 ...

  3. LeedCode 思维训练(二)

    给你一个字符串 s,它由数字('0' - '9')和 '#' 组成.我们希望按下述规则将 s 映射为一些小写英文字符: 字符('a' - 'i')分别用('1' - '9')表示. 字符('j' - ...

  4. Leedcode—机器人走过的路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...

  5. leetcod--Missing Number

    Given an array containing n distinct numbers taken from 0, 1, 2, -, n, find the one that is missing ...

  6. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  7. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  8. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  9. java服务器返回错误码,java - java.io.IOException:服务器返回URL的HTTP响应代码:409 - 堆栈内存溢出...

    我正在使用某些应用程序的API下载文档. 问题是,当我尝试解析inputStream时,它将引发响应代码409异常. 但是最大的问题是它有时会抛出此异常. 此异常的原因是什么? 这是我的代码: URL ...

最新文章

  1. C#编程利器系列文章
  2. python的数组和元组区别_python中数组,列表,元组的区别、定义、功能
  3. TCP/IP协议的编写《转载》
  4. mysql怎么滤空_《MySQL 入门教程》第 08 篇 过滤条件
  5. Outlook应用指南(1)——数据备份还原技巧
  6. 浅谈 EF CORE 迁移和实例化的几种方式
  7. linux 内核文件操作,Linux 内核文件操作
  8. 03-redis数据持久化
  9. 计算平均指令时间_欧姆龙PLC指令应用案例
  10. echarts使用之坑 隐藏显示echarts变形 echarts官网访问不了
  11. 家庭网关斐讯 K3 基础环境篇
  12. Matlab与1stOpt多元非线性回归
  13. 新媒体营销渠道大盘点
  14. 单模光纤和多模光纤的区别
  15. Redis命令-集合-scard
  16. sql select半角html全角,SQL转换全角和半角函数
  17. Allegro如何使用快捷键快速切换层面操作指导
  18. 处理eclipse项目左下角有个红叉的问题
  19. HCIA-Intelligent Computing 题目汇总
  20. 一款免费的PDF转换工具-LightPDF完美版(PDF编辑器) 最新版

热门文章

  1. Analysis of Cloud Computing Architectures阅读笔记--提出了Screen虚拟化方法
  2. easyui启用行号错位解决方案
  3. 阿里云轻应用服务器 宝塔面板 mongodb 配置外网连接 其一 基础配置
  4. 宝塔面板 Windows 2012 R2 使用指南(在更新中)
  5. superagent返回结果乱码
  6. QC无法启动,实战记录
  7. 13新功能_再聊聊灵感盒 -Marginnote 3.6.12/13新功能
  8. ubuntu18虚拟机添加网卡后,不自动启用dhcp
  9. 第14章 任务和特权级保护
  10. (JAVA)StringBuffer类(练习)