【问题标题】:Check for an anagram using only the string class in java仅使用 java 中的字符串类检查字谜
【发布时间】:2018-03-15 04:13:22
【问题描述】:

我有一个任务要编写一个程序,该程序接受 2 个单词,然后返回它们是否是彼此的字谜。目前我正在尝试遍历第一个字母的每个字母,并检查它是否与第二个单词中的字母匹配。然后,我会将 counter int 与任一单词的总长度进行比较,如果它们是字谜,则它们应该相等。

我有一个错误,如果单词是字谜,我会得到一个无限循环向上计数,并且计算以程序结尾的单词中的字母数,如果不是的话。

分配声明“仅使用 String 类中可用的方法。不要使用其他 Java 库实用程序”,因此我无法将单词放入数组并使用 arrays.Sort。

import java.util.Scanner;

public class anagram {
  public static void main (String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter two strings");

    String s1 = scanner.next();
    String s2 = scanner.next();


    int counter = 0;

    int number1 = 0;
    int number2 = 0;

    if(s1.length() != s2.length()) {
        System.out.println("The strings are not anagrams");
    }   else {


        for(int i = 0; i < s1.length() ; i++) {
            for(int j = 0; j < s1.length() ; i++) {

                // number1 = i;
                // number2 = j;

                if(i == s1.length()){
                    number1 = i - 1;
                }
                if(j == s2.length()){
                    number2 = j - 1;
                }


                if(s1.charAt(number1) == s2.charAt(number2)) {
                    counter ++ ;
                    System.out.println(counter);
                }

            }

        }
        System.out.println(counter);

    }

    System.out.println(s1 + " " + s2 + " " + counter);

}

}

【问题讨论】:

  • 您在嵌套循环中将变量 i 增加两次。在你的 j 循环中你有 i++ 它应该是 j++
  • @T Jones 你可以使用数组吗?
  • 是否允许获取每个字符的 ASCII 值?因为这样你就可以将值相加并检查是否相等
  • 您也可以使用String.replaceFirst(String regex, String replacement) 解决此问题并遍历子字符串

标签: java string


【解决方案1】:

你的问题在这里

 for(int j = 0; j < s1.length() ; j++) {   ///change i to j

您正在检查n^2times,但这只能通过2ntimes 完成。

  1. 从第一个字符串中获取所有字母的出现次数(存储在数组中)
  2. 从第二个字符串中获取所有字母的出现次数(存储在数组中)
  3. 同时循环遍历两个数组并比较所有出现的次数是否相同。

您的数组将有 26 个元素存储出现的 a-z(如果不区分大小写)

【讨论】:

  • @T Jones 您可以通过单击我的答案旁边的空心勾号来接受我的解决方案。您将获得 2 个代表作为回报。请注意,每个问题您只能接受 1 个解决方案。
【解决方案2】:

在你的 for 循环的第二级,你正在递增 i 而不是 j。因为 j 从不递增,所以 (j

import java.util.Scanner;

public class anagram {
  public static void main (String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter two strings");

    String s1 = scanner.next();
    String s2 = scanner.next();


    int counter = 0;

    int number1 = 0;
    int number2 = 0;

    if(s1.length() != s2.length()) {
        System.out.println("The strings are not anagrams");
    }   else {


        for(int i = 0; i < s1.length() ; i++) {
            for(int j = 0; j < s1.length() ; j++) { //LOOK HERE <======

                // number1 = i;
                // number2 = j;

                if(i == s1.length()){
                    number1 = i - 1;
                }
                if(j == s2.length()){
                    number2 = j - 1;
                }


                if(s1.charAt(number1) == s2.charAt(number2)) {
                    counter ++ ;
                    System.out.println(counter);
                }

            }

        }
        System.out.println(counter);

    }

    System.out.println(s1 + " " + s2 + " " + counter);

}
}

【讨论】:

  • 谢谢,这样做并取消注释两条注释行解决了我的问题
  • 如果您觉得我的回答解决了您的问题,请标记为解决方案。
猜你喜欢
  • 2021-12-12
  • 2020-06-20
  • 2021-10-10
  • 2015-12-23
  • 2016-02-16
  • 2013-08-18
  • 2016-04-07
相关资源
最近更新 更多