【问题标题】:Anagram Checking Logical Error - Cant seem to find the errorAnagram 检查逻辑错误 - 似乎找不到错误
【发布时间】:2020-06-25 09:59:09
【问题描述】:
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");
    }

  }
}

我使用了一个已访问的布尔数组来检查重复的项目,但它现在显示所有输入的“Not anagram”......

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

【问题讨论】:

  • 尝试对每个字符串中的字母进行排序并比较结果。此外,作为风格问题,您的局部变量 Visited 应以小写字母开头。
  • 在这种情况下使用调试器会非常有用。我强烈建议您在检查这里的答案之前这样做,只是为了练习。稍后再回来看看你自己是否做对了。首先,您可以在更新isAnagram 的值的行中添加断点...

标签: java anagram


【解决方案1】:

您的代码的问题是,即使 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

【讨论】:

  • 很好的答案,但问题实际上是关于原始代码中的错误是什么。我认为包含这些信息会使这个答案更有帮助
  • 感谢@vefthym 的鼓励。我目前正在调查他的答案以找出问题所在。我会更新我的答案来说明我的发现。
  • 我发现了 OP 代码的问题,并更新了我的答案以合并它。
  • 谢谢大家,那(break;)成功了....非常感谢您的帮助和支持...
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多