Anagram 检查逻辑错误 - 似乎找不到错误

Anagram Checking Logical Error - Cant seem to find the error

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

  }
}

我使用 Visited 布尔数组来检查重复项,但它现在显示所有输入的 "Not anagram"....

如果字符串有重复元素,你能告诉我为什么显示 "Not anagram" 吗?

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

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

修改后的输出:

The given Strings are Anagrams

更好的方法如下:

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

输出:

The given Strings are Anagrams

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