[Código de sufrimiento] [409] [java]

#### [título Descripción

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

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

注意:
假设字符串的长度不会超过 1010。

示例 1:

输入:
"abccccdd"

输出:
7

Explicación:
podemos construir la cadena más larga es palíndromo "dccaccd", su longitud es de 7.

codicioso

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 matriz para lograr
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;  
   }
}
estilo de streaming 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;
   }
}

#### [Resumen]

  1. Modulo conversión aritmética (positivo)
  • Es una operación de módulo consume grandes, la mayoría de la lengua tales como compiladores de C ++ están optimizados para la aritmética modular
  • Java es un entero sin signo de que no existe, el número está representado por complemento (el bit más alto es el bit de signo, 0 para el positivo, 1 para negativo)
//正数能优化 负数不能优化
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. Un problema dado, más pensamiento, no siempre quiere atravesar, sería difícil avanzar

Referencia cotejo de datos a partir de: https://mp.weixin.qq.com/s/HtDYSfaikwHozUrksU0A1w

Publicado 22 artículos originales · ganado elogios 0 · Vistas 427

Supongo que te gusta

Origin blog.csdn.net/dadongwudi/article/details/104985484
Recomendado
Clasificación