簡體   English   中英

如何檢查兩個字符串是否是字謎?

[英]How can I check if two strings are anagrams?

這些是我的項目的詳細信息:
字謎:這個項目的目的是創建一個游戲,在這個游戲中,用戶會看到一個字的字謎,並且必須在有限的嘗試次數內猜出正確的單詞。 項目特點:

  1. 用戶被給予固定次數的猜測正確單詞的嘗試。 嘗試的次數取決於單詞的長度。
  2. 在每次不正確的嘗試之后,都會向用戶提供正確單詞的提示。
  3. 如果用戶無法在固定的嘗試次數內猜出正確的單詞,則會顯示正確的單詞,游戲繼續進行下一個單詞。
  4. 提供退出游戲的控制。

我面臨的問題:

我能夠從字符串數組中隨機抽取一個單詞,但無法將其與輸出進行比較,因為輸出是一個普通字符串。 我想知道如何解決這個問題以及我應該如何進一步進行,我不需要提示部分的答案,只想知道如何比較 2 種類型的字符串。

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");
        }
    }
}

我可以提供兩種方法來檢查兩個字符串是否是字謎:

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)
}

您可以從這些字符串中獲取兩個字符數組,對它們進行排序,然后檢查這些數組是否彼此相等。

/**
 * @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 函數將字謎列表分組為列表映射

使用集合檢查兩個字符串是否為字謎:

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;
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM