我在java Netbeans中编写以下代码,这对于普通的字谜非常有用.但是如果两个文本字段包含包含重复字母的单词,则代码无法正常工作.可能是什么问题,我该如何解决?我对Java很基础,还不能理解Arrays.
String s1= t1.getText();
String s2= t2.getText();
int b=0,c=0;
if(s1.length()!=s2.length())
System.out.print("No");
else {
for(int i=0;i<s1.length();i++) {
char s = s1.charAt(i);
for(int j=0;j<s2.length();j++) {
if(s==s2.charAt(j)){
b++;
}
}
if(b==0)
break;
}
if(b==0)
System.out.print("No");
else
System.out.print("YES");
}
System.out.print(b);
Run Code Online (Sandbox Code Playgroud)
Iva*_*ani 28
我会寻找一些更简单的理由:如果排序一次,它们完全匹配,则两个字符串是字谜.所以在Java中它会是这样的:
String s1 = "cat";
String s2 = "tac";
boolean isAnagram = false;
if (s1.length() == s2.length()) {
char[] s1AsChar = s1.toCharArray();
char[] s2AsChar = s2.toCharArray();
Arrays.sort(s1AsChar);
Arrays.sort(s2AsChar);
isAnagram = Arrays.equals(s1AsChar, s2AsChar);
}
Run Code Online (Sandbox Code Playgroud)
您想比较排序的字符.这是一个单行:
return Arrays.equals(s1.chars().sorted().toArray(),
s2.chars().sorted().toArray());
Run Code Online (Sandbox Code Playgroud)
Arrays.equals() 比较长度和所有元素.
小智 9
在我的解决方案中,我们计算第一个字符串中每个字符的外观,然后从第二个字符串中的计数中减去它.最后,检查字符数是否不为0,那么两个字符串不是anagram.
public static boolean isAnagram(String a, String b){
//assume that we are using ASCII
int[] charCnt = new int[256];
for(int i = 0; i < a.length(); i++){
charCnt[a.charAt(i)]++;
}
for(int i = 0; i< b.length(); i++){
charCnt[b.charAt(i)]--;
}
for(int i = 0; i<charCnt.length; i++){
if(charCnt[i] != 0) return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
由于您似乎是一个初学者,因此这里提供的解决方案不涉及其他类或流中的函数。它仅涉及数组的使用,并且a char也可以表示int。
public static void main(String[] args) throws ParseException {
String s1= "anagram";
String s2= "margana";
// We make use of the fact that a char does also represent an int.
int lettersS1[] = new int[Character.MAX_VALUE];
int lettersS2[] = new int[Character.MAX_VALUE];
if(s1.length()!=s2.length())
System.out.print("No");
else {
// Loop through the String once
for(int i = 0; i<s1.length() ;++i) {
// we can just use the char value as an index
// and increase the value of it. This is our identifier how often
// each letter was aviable in the String. Alse case insensitive right now
lettersS1[s1.toLowerCase().charAt(i)]++;
lettersS2[s2.toLowerCase().charAt(i)]++;
}
// set a flag if the Strings were anagrams
boolean anag = true;
// We stop the loop as soon as we noticed they are not anagrams
for(int i = 0;i<lettersS1.length&&anag;++i) {
if(lettersS1[i] != lettersS2[i]) {
// If the values differ they are not anagrams.
anag = false;
}
}
// Depending on the former loop we know if these two strings are anagrams
if(anag) {
System.out.print("Anagram");
} else {
System.out.print("No anagram");
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26586 次 |
| 最近记录: |