[leedcode][409][java]
生活随笔
收集整理的這篇文章主要介紹了
[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表示負數)
資料參考整理來自:https://mp.weixin.qq.com/s/HtDYSfaikwHozUrksU0A1w
總結
以上是生活随笔為你收集整理的[leedcode][409][java]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python读取罗技G29数据
- 下一篇: codeup 1128: 出租车费 贪