欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

[leedcode][409][java]

发布时间:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 [leedcode][409][java] 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

####【题目描述】

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "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;} }

####【总结】

  • 取模运算转化(正数)
    • 取模是一个消耗较大的操作,因此大多数语言的编译器比如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
  • 一题多解,多思考,不要总想遍历,否则很难进步
  • 资料参考整理来自:https://mp.weixin.qq.com/s/HtDYSfaikwHozUrksU0A1w

    总结

    以上是生活随笔为你收集整理的[leedcode][409][java]的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。