如何检查两个字符串是不是是字谜?
Posted
技术标签:
【中文标题】如何检查两个字符串是不是是字谜?【英文标题】:How can I check if two strings are anagrams?如何检查两个字符串是否是字谜? 【发布时间】:2021-01-11 00:04:02 【问题描述】:这些是我的项目的详细信息: Anagrams:这个项目的目的是创建一个向用户展示的游戏 一个单词的字谜,必须在有限的数量内猜出正确的单词 尝试。 项目特点:
-
为用户提供了固定次数的猜测正确单词的尝试。号码
尝试次数取决于单词的长度。
每次错误尝试后,都会向用户提供正确单词的提示。
如果用户在固定的尝试次数内无法猜出正确的单词,则
显示正确的单词,然后游戏继续下一个单词。
控制退出游戏。
我面临的问题:
我能够从字符串数组中获取一个随机单词,但由于输出是普通字符串,因此无法将其与输出进行比较。我想知道如何解决这个问题以及我应该如何进一步进行,我不需要提示部分的答案,只想知道如何比较两种类型的字符串。
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】:你可以从这些字符串中得到两个字符数组,对它们进行排序,然后检查这些数组是否相等。
/**
* @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;
【讨论】:
以上是关于如何检查两个字符串是不是是字谜?的主要内容,如果未能解决你的问题,请参考以下文章
为了检查两个字符串是不是是字谜, hashfunction() 的逻辑应该是啥?
这是一个字谜程序,我正在检查两个相同长度的字符串是不是相互字谜