检查字符串是否为pangram的高效Java语言构造?

检查字符串是否为pangram的高效Java语言构造?,java,algorithm,performance,optimization,pangram,Java,Algorithm,Performance,Optimization,Pangram,到目前为止,我已经想到了这个。我尝试最小化字符串操作,并将解决方案隔离到内置数据类型、数组和整数操作 我正在寻找一种更优雅的方法,用java检查pangram字符串 优雅,就像在最少的代码行中一样,其他高效的算法也很受欢迎 请提供没有lambda表达式的建议 private static boolean isPangrams(String ip) { char[] characterArray = ip.toLowerCase().toCharArray();

到目前为止,我已经想到了这个。我尝试最小化字符串操作,并将解决方案隔离到内置数据类型、数组和整数操作

我正在寻找一种更优雅的方法,用java检查pangram字符串

优雅,就像在最少的代码行中一样,其他高效的算法也很受欢迎

请提供没有lambda表达式的建议

    private static boolean isPangrams(String ip) {

        char[] characterArray = ip.toLowerCase().toCharArray();
        int map[] = new int[26];
        int sum = 0;

        for(char current : characterArray) {

            int asciiCode = (int) current;
            if (asciiCode >= 97 && asciiCode <= 122) {

                if (map[122 - asciiCode] == 0) {

                    sum += 1;
                    map[122 - asciiCode] = 1;
                }
            }
        }

        return sum == 26;
    }
私有静态布尔isPangrams(字符串ip){
char[]characterArray=ip.toLowerCase().toCharray();
int map[]=新int[26];
整数和=0;
用于(当前字符:characterArray){
int ASCICODE=(int)电流;

如果(ascicode>=97&&ascicode,如果发现 map[122-ascicode]不等于零,因为从那时起它就不再是pangram了,而您可以将for()的其余部分保留下来-我说的对吗? 我知道这不是你期望的改进(特别是只有26个步骤),而是我想到的

        if (map[122 - asciiCode] == 0) {

            sum += 1;
            map[122 - asciiCode] = 1;
        } else return false;

最有效的解决方案O(n)时间复杂度:

  • 迭代字符串并将每个字母放入
    HashMap
    键:字母,值:计数
  • 反复浏览地图,检查字母表中的每个字母

  • 如果你想要一个难以理解的几句话,回答:

    private static boolean isPangrams(String ip) {
      return 26== (new HashSet(Arrays.asList(ip.toUpperCase().replaceAll("[^A-Z]", "").toCharArray()))).size();
    }
    
    说明:

  • 使字符串大写(将“a”和“a”处理为相同)
  • 删除非A、B…Z的所有字符
  • 将其转换为
    char[]
  • 将数组转换为
    集合
  • 将集合添加到
    集合
    ,以清除所有Doublette
  • 测试集合的大小

  • 您应该意识到,此代码不易阅读且不易执行。

    您可以使用按位操作:

    private static boolean isPangrams(String ip) {
        int flags = 0;
        for(char current : ip.toLowerCase().toCharArray()) {
            if (current >= 'a' && current <= 'z') {
                flags |= 0x01<<(current-'a');
            }
        }
        return flags == 0x3ffffff;
    }
    
    私有静态布尔isPangrams(字符串ip){
    int标志=0;
    for(当前字符:ip.toLowerCase().toCharArray()){
    
    如果(current>='a'&¤t如果字符串包含int变量中的给定字母,则可以“打包”数据

    static boolean pangram (String s) {
        int check = 0;
        String lowerCase = s.toLowerCase();
        for (int i = 0; i < lowerCase.length(); i++) {
          char ch = lowerCase.charAt(i);
          if (ch >= 'a' && ch <= 'z') {
            check |= (1 << s.charAt(i) - 'a');
          }
        }
        return check == 67108863;
      }
    
    static boolean pangram(字符串s){
    整数检查=0;
    String lowerCase=s.toLowerCase();
    for(int i=0;i如果(ch>='a'&&ch那么,“改进”工作代码应该去codereview.stackexchange.com…无论如何:它不会变得更好,但是你可以使用位集而不是整数数组-当真/假是你真正需要的时候为什么要使用数字?!位集是一个整洁的输入。谢谢。我认为pangram的定义都是字符(a-z)至少有一次。你是对的,一个pangram必须至少包含每个字符一次。我想到了一个“完美pangram”,它只包含每个字母一次。Wikipedia/pangram:“一个完美pangram只包含字母表的每个字母一次,可以被认为是字母表的一个anagram”问题中的算法是O(n)太多了。所以复杂性不可能提高。是的,它在性能部分失败。但是,它满足我的要求。为什么要强制转换
    char
    'current'并将其存储在
    int
    'asciocode'中?您所做的所有操作都可以使用原始
    char
    'current'而不是'asciocode'来完成。