【问题标题】:How can I check if two strings are anagrams?如何检查两个字符串是否是字谜?
【发布时间】:2021-01-11 00:04:02
【问题描述】:

这些是我的项目的详细信息:
Anagrams:这个项目的目的是创建一个向用户展示的游戏 一个单词的字谜,必须在有限的数量内猜出正确的单词 尝试。 项目特点:

  1. 为用户提供了固定次数的猜测正确单词的尝试。号码 尝试次数取决于单词的长度。
  2. 每次错误尝试后,都会向用户提供正确单词的提示。
  3. 如果用户在固定的尝试次数内无法猜出正确的单词,则 显示正确的单词,然后游戏继续下一个单词。
  4. 控制退出游戏。

我面临的问题:

我能够从字符串数组中获取一个随机单词,但由于输出是普通字符串,因此无法将其与输出进行比较。我想知道如何解决这个问题以及我应该如何进一步进行,我不需要提示部分的答案,只想知道如何比较两种类型的字符串。

import java.util.Arrays;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.*;
import java.util.Scanner;
import java.util.*;

public class main {
    String A = "words[index]";

    static boolean isAnagram(String A, String B) {
        if (A.length() != B.length()) {
            return false;
        } else {
            char a[] = A.toLowerCase().toCharArray();
            char b[] = A.toLowerCase().toCharArray();

            Arrays.sort(a);
            Arrays.sort(b);
            String sortedA = String.valueOf(a);
            String sortedB = String.valueOf(B);
            if (sortedA.equals(sortedB)) {
            }
        }
        return false;
    }

    public static void main(String[] args) {
        String[] words = {"Rat", "Car", "Below", "Taste", "Cried", "Study", "Thing", "Chin"};
        Random random = new Random();
        int index = random.nextInt(words.length);
        System.out.println("The given word is: " + words[index]);

        Scanner sc = new Scanner(System.in);
        String B = sc.next();
        if (isAnagram(String A, String B)) {
            System.out.println("not an angram");
        } else {
            System.out.println("Sucess");
        }
    }
}

【问题讨论】:

    标签: java arrays string project anagram


    【解决方案1】:

    你可以从这些字符串中得到两个字符数组,对它们进行排序,然后检查这些数组是否相等。

    /**
     * @param a first string.
     * @param b second string.
     * @return whether two strings are case insensitive anagrams of each other.
     */
    static boolean isAnagram(String a, String b) {
        // invalid incoming data
        if (a == null || b == null
                || a.length() != b.length()) return false;
        return Arrays.equals(
                a.toLowerCase().codePoints().sorted().toArray(),
                b.toLowerCase().codePoints().sorted().toArray());
    }
    
    public static void main(String[] args) {
        System.out.println(isAnagram("Study", "dusty")); // true
        System.out.println(isAnagram("door", "rooD"));   // true
        System.out.println(isAnagram("door", "root"));   // false
    }
    

    另见:Java 8 Stream function to group a List of anagrams into a Map of Lists

    【讨论】:

      【解决方案2】:

      我可以提供两种方法来检查两个字符串是否是字谜:

      1.

      static boolean isAnagram(String A, String B) {
          if (A.length() != B.length()) return false;
          else {
              char[] a = A.toLowerCase().toCharArray();
              char[] b = A.toLowerCase().toCharArray();
              Arrays.sort(a);
              Arrays.sort(b);
              for (int i = 0; i < a.length; i++)
                  if (a[i] != b[i]) return false;
              return true; //time Complexity: O(nLogn)
          }
      }
      
      static int NUM_OF_CHARS = 256;
      
      static boolean isAnagram(String A, String B) {
          if (A.length() != B.length()) return false;
          else {
              int[] count1 = new int[NUM_OF_CHARS];
              Arrays.fill(count1, 0);
              int[] count2 = new int[NUM_OF_CHARS];
              Arrays.fill(count2, 0);
              char[] a = A.toCharArray();
              char[] b = A.toCharArray();
              for (int i = 0; i < a.length && i < b.length; i++) {
                  count1[a[i]]++;
                  count2[b[i]]++;
              }
              for (int i = 0; i < NUM_OF_CHARS; i++)
                  if (count1[i] != count2[i]) return false;
              return true;
          }//time Complexity: O(n)
      }
      

      【讨论】:

        【解决方案3】:

        使用集合检查两个字符串是否是字谜:

        package StringPackage;
        import java.util.*;
        
        public class AnagramUsingCollections {
            public static void main(String[] args) {
                // TODO Auto-generated method stub
                char[] string1 = "aab".toCharArray();
                char[] string2 = "baa".toCharArray();
        
                Map<Character, Integer> hm = new HashMap<>();
                for (char no : string1) {
                    //for start
                    Integer count = hm.get(no);
                    if (count == null) {
                        hm.put(no, 1);
                    } else {
                        count++;
                        hm.put(no, count);
                    }
                    //for end
                }
                if (string1.length == string2.length) {
                    for (char no : string2) {
                        //baa
                        Integer count = hm.get(no);
                        if (count == null) {
                            hm.put(no, 1);
                        } else {
                            count--;
                            hm.put(no, count);
                        }
                    }//for end
                }
                Set<Map.Entry<Character, Integer>> se = hm.entrySet();
                for (Map.Entry<Character, Integer> me : se) {
                    if (me.getValue() > 0) {
                        System.out.println("Not an anagram");
                        break;
                    } else {
                        System.out.println("IS an anagram");
                        break;
                    }
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-04-07
          • 2019-05-02
          • 2013-08-18
          • 2021-10-10
          • 2018-09-22
          • 2013-02-09
          • 2015-05-30
          相关资源
          最近更新 更多