【问题标题】:Code to tell whether a string is a Pangram or not?判断字符串是否为 Pangram 的代码?
【发布时间】:2015-03-20 18:34:18
【问题描述】:
import java.io.*;
import java.util.*;


public class Solution {

    public static final int n = 26; 

    public int check(String arr) {
        if (arr.length() < n) {
           return -1;
        }
        for (char c = 'A'; c <= 'Z'; c++) {
            if ((arr.indexOf(c) < 0) && (arr.indexOf((char)(c + 32)) < 0)) {
               return -1;
            }
        }
        return 1;
    }  
}

public static void main(String[] args) {
    Scanner s1 = new Scanner(System.in);
    String s = s1.next();
    Solution obj = new Solution();

    int d = obj.check(s);

    if (d == -1) {
        System.out.print("not pangram");
    } else {
        System.out.print("pangram");
    }
}

如果输入的字符串是:
我们及时为下一个奖品评出古董象牙扣

它会给出错误输出:
not pangram

我无法找出代码有什么问题。
提前致谢!

【问题讨论】:

  • 让我们调试你的代码,为什么检查方法返回-1?您在多个地方返回 -1。然后你会得到你的答案。
  • 第一个返回是当我的字符串的长度小于 26 个字符时.. 因此,如果长度大于它就不能是一个 pangram 然后它继续检查所有字母是否都存在于字符串与否.. 如果不是,它最终返回 -1 如果通过字符串运行良好,它返回 1
  • @bummi:不是真的。提议的副本要求任何算法; OP 有一个,但它包含错误。

标签: java string java.util.scanner pangram


【解决方案1】:

问题在于 空格Scanner.next() 的分隔符。因此,当您输入We promptly judged antique ivory buckles for the next prize 时,s 将仅指向字符串We。当您在We 上调用obj.check(s) 时,它将返回-1

要验证是否是这种情况,您可以打印s 并检查其值。你也可以这样做:

String s = "We promptly judged antique ivory buckles for the next prize";

致电obj.check(s),看看它会返回正确答案。

要修复它,您应该调用Scanner.nextLine() 而不是Scanner.next()

String s = s1.nextLine();

【讨论】:

    【解决方案2】:
    May be program by using set will make solution easier ..:)
    
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.HashSet;
    import java.util.Set;
    
    public class Pangram {
    
    public static void main(String args[]) {
    
        try {
            final String str;
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            str = br.readLine().toLowerCase().replaceAll(" ", "");
    
            char[] chars = str.toCharArray();
            final Set set = new HashSet();
    
            for(char c: chars){
                set.add(c);
            }
    
            System.out.println(set.size());
            if(set.size() == 26)
               System.out.println("pangram");
            else
                System.out.println("not pangram");
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    

    }

    【讨论】:

    • 可能是一个更好的解决方案,但 OP 正在询问他自己的代码有什么问题——而不是更好的解决方案。
    【解决方案3】:

    另一个版本:

    import java.io.*;
    import java.util.*;
    import java.text.*;
    import java.math.*;
    import java.util.regex.*;
    
    public class Solution {
    
        public static void main(String[] args) {
    
            Scanner scan = new Scanner(System.in);
            String sentence = scan.nextLine();
            sentence = sentence.toUpperCase();
            sentence = sentence.replaceAll("[^A-Z]", "");
    
            char[] chars = sentence.toCharArray();
    
            Set<Character> set = new HashSet<Character>();
    
            for( int i = 0; i < chars.length; i++ ) set.add(chars[i]);
    
            System.out.println(set.size() == 26 ? "pangram" : "not pangram");
    
        }
    }
    

    【讨论】:

      【解决方案4】:

      针对您的问题的另一个类似解决方案。

       public class PangramExample {  
      
            public static void main(String[] args) {  
                 String s = "The quick brown fox jumps over the lazy dog";  
                 System.out.println("Is given String Pangram ? : "  
                           + isPangramString(s.toLowerCase()));  
            }  
            private static boolean isPangramString(String s) {  
                 if (s.length() < 26)  
                      return false;  
                 else {  
                      for (char ch = 'a'; ch <= 'z'; ch++) {  
                           if (s.indexOf(ch) < 0) {  
                                return false;  
                           }  
                      }  
                 }  
                 return true;  
            }  
       }  
      

      供参考,请参考此链接http://techno-terminal.blogspot.in/2015/11/java-program-to-check-if-given-string.html

      【讨论】:

      • OP 没有寻找替代解决方案。
      【解决方案5】:

      导入 java.io.; 导入 java.util.;

      公共类解决方案{

      public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);
         String input = scanner.nextLine(); 
          System.out.println(isPangram(input) ? "pangram" : "not pangram"); 
      }
      
      static boolean isPangram(String input) {
          boolean isPangram = false;
      
          if(input == null || input.length() < 26) {
              return isPangram;
          }
      
          input = input.toLowerCase();
          char [] charArray = input.toCharArray();
          Set<Character> charSet = new HashSet<>();
          for(char c : charArray) {
              if(Character.isLetter(c) && (!Character.isWhitespace(c))) {
                  charSet.add(c);
              }
          }
          if (charSet.size() == 26) {
              isPangram = true;
          }
          return isPangram;
      }   
      

      }

      【讨论】:

        【解决方案6】:
        import java.util.Scanner;
        
        public class Pangrams {
        
            /**
             * @param args
             */
            public static void main(String[] args) {
                // TODO Auto-generated method stub
                Scanner sc = new Scanner(System.in);
                String s = sc.nextLine();
                int[] a = new int[26];
                int count =0;
                for(int i=0;i<s.length();i++){
                    if(s.charAt(i)>=65 && s.charAt(i)<=90){
                        if(a[s.charAt(i)-65]==0)
                            count++;
                        a[s.charAt(i)-65]++;
                    }
                    else if(s.charAt(i)>=97 && s.charAt(i)<=122){
                        if(a[s.charAt(i)-97]==0)
                            count++;
                        a[s.charAt(i)-97]++;
                    }
                }
                if(count==26)
                    System.out.println("pangram");
                else
                    System.out.println("not pangram");
            }
        
        }
        

        【讨论】:

        【解决方案7】:

        这应该可以解决它:

        import java.io.*;        
        import java.util.*;
        import java.text.*;
        import java.math.*;
        import java.util.regex.*;
        
        public class Solution {
        
                public static boolean isPangram(String test){
                    for (char a = 'A'; a <= 'Z'; a++)
                        if ((test.indexOf(a) < 0) && (test.indexOf((char)(a + 32)) < 0))
                            return false;
                    return true;
                }
        
                public static void main(String[] args)throws IOException {
                    /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
                   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                    String test=br.readLine();
                    if(isPangram(test.toUpperCase())){
        
                        System.out.println("pangram");
        
                    }if(isPangram(test.toUpperCase())==false){
        
                        System.out.println("not pangram");
        
                    }
                }
            }
        

        【讨论】:

        • 请描述您的修复。 OP 明确询问他的代码有什么问题。
        【解决方案8】:
        import java.io.*;
        import java.util.*;
        import java.text.*;
        import java.math.*;
        import java.util.regex.*;
        
        public class Solution {
        
            public static void main(String[] args) {
        
                String s;
                char f;
                 Scanner in = new Scanner(System.in);
                s = in.nextLine();
        
                char[] charArray = s.toLowerCase().toCharArray();
                final Set set = new HashSet();
        
                for (char a : charArray) {
                    if ((int) a >= 97 && (int) a <= 122) {
                        f = a;
                        set.add(f);
                    }
        
                }
                if (set.size() == 26){
                    System.out.println("pangram");
                }
                else {
                    System.out.println("not pangram");
                }
            }
        }
        

        【讨论】:

        • 请描述如何修复 OP 的代码。据我所知,这是一个完全独立的解决方案。
        【解决方案9】:
        import java.util.Scanner;
        
        public class Pangram {
        
            public static void main(String[] args) {
            int count=0;//Initialize counter to zero
            char[] arr = new char[26];//Character array of 26 size as there are 26 alphabets
            Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
        
            for(int i= 0; i<s.length();i++)
            {
                if(s.charAt(i)>=65 && s.charAt(i)<=90)//Ascii value of A to Z(caps)
                {
                    if(arr[s.charAt(i)-65]==0)
                    {
                        count++;
                        arr[s.charAt(i)-65]=1;
                    }   
                }
        
                if(s.charAt(i)>=97 && s.charAt(i)<=122)//Ascii value of a to z
                {
                    if(arr[s.charAt(i)-97]==0)
                    {
                        count++;
                        arr[s.charAt(i)-97]=1;
                    }
        
                }
            }
        
            System.out.println(count);
        
            if(count==26)
            {
                System.out.println("Pangram");
            }
            else
                System.out.println("not Pangram");
            }
        
        }
        

        【讨论】:

          【解决方案10】:

          另一种方法

          public boolean isPanGram(String arg)
          {
              String temp = arg.toLowerCase().replaceAll(" ", "");
          
              String str = String.valueOf(temp.toCharArray());
              String[] array = str.split("");
              Set<String> tempSet = new TreeSet(Arrays.asList(array));
              if(tempSet.size()==26)
              {
                  List loopList = new ArrayList();
                  loopList.addAll(tempSet);
                  if(loopList.get(0).equals("a") && loopList.get(25).equals("z"))
                      return true;
              }
          
          return false;   
          }
          

          【讨论】:

            【解决方案11】:

            试试看

            static String pangrams(String s) {
            
                String result="";
                String ls = s.toLowerCase();
                HashSet<Character> ts=new HashSet<Character>(); 
                for(int i=0;i<ls.length();i++){
                    if(ls.charAt(i)!=' '){
                        ts.add(ls.charAt(i));
                    }
                }
                if(ts.size()==26){
                    result="pangram";
                }
                else{
                    result="not pangram";
                }
                return result;
            }
            

            【讨论】:

              【解决方案12】:

              另一个使用 HashSet 集合的简单程序。

              import java.util.HashSet;
              
              public class Panagram {
              
                  public static void main(String[] args) {
                      pangrams("qmExzBIJmdELxyOFWv LOCmefk TwPhargKSPEqSxzveiun");
                  }
              
                  static String pangrams(String s) {
              
                      String inputString = s.toLowerCase();
              
                      HashSet<String> toRemoveDuplicates = new HashSet<String>();
                      for (String eachAlphabet : inputString.split("")) {
                          toRemoveDuplicates.add(eachAlphabet);
                      }
              
                      // Total alphabets are 26 + one space, so 27.
                      if (toRemoveDuplicates.size() == 27) 
                          return "panagram";
                       else 
                          return "not panagram";
                  }
              }
              

              【讨论】:

                【解决方案13】:

                这是一种不同的方法,但易于理解和编写。 首先删除所有标点符号/空格,然后删除所有重复的字母。 最后确保修改后的字符串正好有 26 个字母。

                public class Pangrams {
                
                    public static void main(String[] args) {
                        String s = "The quick brown fox jumps over the lazy dog" //any text
                                   .replaceAll("[^a-zA-Z]+", "") //remove all punctuation and whitespace
                
                        if (s.length() < 1 || s.length() > 100)
                            System.exit(0);
                
                        boolean isPangram = false;
                        char ch;
                        String modifiedStr = "";
                
                        //remove all duplicate letters
                        for (int i = 0; i < s.length(); i++) {
                            ch = s.charAt(i);
                            if (ch != ' ') {
                                modifiedStr += ch;
                                s = s.replace(ch, ' ');
                            }
                        }
                
                        //check whether it has exactly 26 letters
                        if (modifiedStr.length() == 26) {
                            isPangram = true;
                            System.out.println("I am a pangram");
                        }
                        else System.out.println("I am not a pangram");
                
                    }
                
                }
                

                【讨论】:

                  【解决方案14】:

                  普通的 Java for 循环来检测字符串是否为 Pangram:

                  for (char c = 'a'; c <= 'z'; c++)
                  if (str.toLowerCase().indexOf(c)== -1)
                      return false;
                  

                  【讨论】:

                    【解决方案15】:

                    这是一种更直接的方法。它还考虑了字母的重复、空格的数量、制表符等。您实际上可以使用实时句子进行锻炼。而且,如果您是新手,您不会觉得这段代码难以理解(或者我希望如此):)

                    import java.io.*;
                    import java.util.*;
                    
                    public class Solution{
                    
                        static boolean check(String str){
                    
                            str=str.toUpperCase();
                            int count=0;
                            for(char c='A';c<='Z';c++){
                                if( (str.indexOf(c)>=0) )
                                    count++;
                            }
                            if(count ==26)
                                return true;
                            else
                                return false;
                        }
                    
                        public static void main(String args[]){
                    
                            Scanner scan=new Scanner(System.in);
                            String s=scan.nextLine();
                            if(check(s))
                                System.out.println("pangram");
                            else
                                System.out.println("not pangram");
                    
                        }
                    }
                    

                    【讨论】:

                      【解决方案16】:
                      public class Panagram 
                      {
                          public static void main(String[] args) {
                      
                              Scanner sc = new Scanner(System.in);
                              System.out.println("enter string ");
                              String s = sc.nextLine();
                              System.out.println("given string is :"+"\n" +s);
                              String st=removeSpace(s);
                      
                             int d = check(st);
                              if(d == -1)
                                  System.out.print(s+"\n" + "is not pangram");
                              else
                                   System.out.print(s+"\n" +"is a pangram");
                      
                          }
                          public static String removeSpace(String s) 
                          {
                              char ch[]=s.toCharArray();
                              String nstr="";
                              for (int i = 0; i < s.length(); i++) 
                              {
                                  if (ch[i]!=' ') 
                                  {
                                      nstr=nstr + ch[i];
                                  }
                              }
                      
                         return nstr;
                          }
                      
                          public  static int check(String st)
                          {
                      
                               int n = 26; 
                      
                              if(s.length() < n){
                                 return -1;   }
                      
                              for(char i = 'A'; i <= 'Z' ; i++){
                                  if((st.indexOf(i) < 0) && (st.indexOf((char)(i + 32)) < 0))
                      

                      【讨论】:

                      • 欢迎来到 Stack Overflow!这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时对自己的帖子发表评论,一旦您earn足够reputation,您就可以comment on any post。如果您有一个相关但不同的问题,ask a new question 参考这个问题,如果它有助于提供上下文。
                      猜你喜欢
                      • 2010-09-21
                      • 1970-01-01
                      • 2014-09-06
                      • 2012-08-04
                      • 2014-11-20
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-05-31
                      相关资源
                      最近更新 更多