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;”应该可以解决问题。
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;”应该可以解决问题。