Java 字谜检查逻辑错误-似乎找不到错误 公共类anagramun优化{ 公共静态void main(字符串[]args){ 字符串a=“好”; 字符串b=“ogod”; 布尔值isAnagram=false; 字符串c=a.toLowerCase(); 字符串d=b.toLowerCase(); 如果(c.length()==d.length()){ boolean[]访问=新的boolean[a.length()]; 对于(int i=0;i

Java 字谜检查逻辑错误-似乎找不到错误 公共类anagramun优化{ 公共静态void main(字符串[]args){ 字符串a=“好”; 字符串b=“ogod”; 布尔值isAnagram=false; 字符串c=a.toLowerCase(); 字符串d=b.toLowerCase(); 如果(c.length()==d.length()){ boolean[]访问=新的boolean[a.length()]; 对于(int i=0;i,java,anagram,Java,Anagram,我使用了一个访问过的布尔数组来检查重复项,但现在所有输入都显示为“非字谜” 你能告诉我,如果字符串有重复的元素,为什么它会显示“不是字谜”吗 代码的问题是,即使当访问[j]更改为true时,您仍在继续循环,而此时您需要中断内部循环。按如下方式操作: public class AnagramUnoptimized { public static void main(String[] args) { String a = "good"; String b = "ogod";

我使用了一个访问过的布尔数组来检查重复项,但现在所有输入都显示为“非字谜”


你能告诉我,如果字符串有重复的元素,为什么它会显示“不是字谜”吗

代码的问题是,即使当
访问[j]
更改为
true
时,您仍在继续循环,而此时您需要中断内部循环。按如下方式操作:

public class AnagramUnoptimized {
  public static void main(String[] args) {

    String a  = "good";
    String b  = "ogod";
    boolean isAnagram = false;

    String c = a.toLowerCase();
    String d = b.toLowerCase();

    if(c.length()==d.length()) {
        boolean [] Visited = new boolean[a.length()];
        for (int i = 0; i < c.length(); i++) {
            isAnagram = false;
            for (int j = 0; j < d.length(); j++) {
                if (c.charAt(i) == d.charAt(j) && Visited[j]==false) {
                    isAnagram = true;
                    Visited[j] = true;
                }
            }
            if (isAnagram == false) {
                break;
            }
        }
    }
    if(isAnagram==true){
        System.out.println("The given Strings are Anagrams");
    }
    else{
        System.out.println("The given Strings are not Anagrams");
    }

  }
}
The given Strings are Anagrams
更好的方法如下:

public class AnagramUnoptimized {
  public static void main(String[] args) {

    String a  = "good";
    String b  = "ogod";
    boolean isAnagram = false;

    String c = a.toLowerCase();
    String d = b.toLowerCase();

    if(c.length()==d.length()) {
        boolean [] Visited = new boolean[a.length()];
        for (int i = 0; i < c.length(); i++) {
            isAnagram = false;
            for (int j = 0; j < d.length(); j++) {
                if (c.charAt(i) == d.charAt(j) && Visited[j]==false) {
                    isAnagram = true;
                    Visited[j] = true;
                }
            }
            if (isAnagram == false) {
                break;
            }
        }
    }
    if(isAnagram==true){
        System.out.println("The given Strings are Anagrams");
    }
    else{
        System.out.println("The given Strings are not Anagrams");
    }

  }
}
The given Strings are Anagrams
输出:

for (int j = 0; j < d.length(); j++) {
    if (c.charAt(i) == d.charAt(j) && visited[j] == false) {
        isAnagram = true;
        visited[j] = true;
        break;
    }
}
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String a = "good";
        String b = "ogod";

        char[] first = a.toLowerCase().toCharArray();
        char[] second = b.toLowerCase().toCharArray();
        Arrays.sort(first);
        Arrays.sort(second);

        boolean isAnagram = Arrays.equals(first, second);

        if (isAnagram == true) {
            System.out.println("The given Strings are Anagrams");
        } else {
            System.out.println("The given Strings are not Anagrams");
        }
    }
}

在代码中,当 条件“如果(c.charAt(i)=d.charAt(j)&&Visited[j]==false)”
我们已经见面了。因为它仍然在第二次搅拌中循环,如果它遇到相同的char one angain,它将把visted[]的值更改为true两次,从而导致错误。在这个例子中,这是一个女巫字符'o'的情况。在if语句末尾添加“break;”可以解决问题。

尝试对每个字符串中的字母进行排序并比较结果。另外,作为一种风格,您的局部变量
应该以小写字母开头。在这种情况下,使用调试器将非常有用。我强烈建议你在这里检查答案之前这样做,只是为了练习。稍后再来看看你自己是否做对了。对于start,您可以在更新
isAnagram
值的行中添加断点。回答得好,但问题实际上是原始代码中的错误是什么。包括这些信息将使这个答案更加有用,我想谢谢@vefthym的鼓励之词。我目前正在调查他的答案,以找出问题所在。我将更新我的答案以放置我的发现。我发现了OP代码的问题,并更新了我的答案以合并它。谢谢各位,(break;)成功了。。。。非常感谢你的帮助和支持。。。