【问题标题】:How to sort a String and check for anagrams?如何对字符串进行排序并检查字谜?
【发布时间】:2021-12-30 23:52:11
【问题描述】:

我应该编写一个算法来测试两个字符串以检查它们是否是彼此的字谜,我必须使用 BubbleSort、SelectionSort 或 InsertionSort。 所以我使用SelectionSort对Strings进行排序,我事先将其转换为char数组,但它不起作用,我找不到我的错误。

public static void selectionSort(char[] arr) {

    for (int i = 0; i < arr.length - 1; i++) {
        int least = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[least])
                least = j;
            if (least != i) {
                int swap = arr[i];
                arr[i] = arr[least];
                arr[least] = (char) swap;

            }
        }
    }
}

public static boolean anagramCheck(String x, String y) {

    x.trim();
    y.trim();

    x.toLowerCase();
    y.toLowerCase();

    char xarr[] = x.toCharArray();
    char yarr[] = y.toCharArray();

    if (x.length() != y.length())
        return false;

    selectionSort(xarr);
    System.out.println(xarr); // I used this to check if the Strings are sorted correctly
    selectionSort(yarr);
    System.out.println(yarr);

    if (xarr == yarr) {
        System.out.println("It's an anagram.");
        return true;
    } else {
        return false;
    }
}

我应该忽略大写字母和空格,这就是我使用 trim() 和 toLowerCase() 的原因。但它既不修剪空格也不将大写字母更改为小写字母。此外,当我使用超过 5 个字母时,它不会按字母顺序对给定的字符串进行排序。两者中只有一个是正确排序的,另一个是混乱的。 我是 Java 编程新手,所以我可能需要一些帮助。 提前致谢

【问题讨论】:

  • 如果您当前的输出与您想要的输出不匹配,并且您不知道为什么,那么是时候开始调试了。如果您不确定如何执行此操作,请查看How to debug small programs。它不会解决您的直接问题,但会为您提供可以遵循的步骤,这些步骤应该可以帮助您自己解决问题,或者即使这不成功,也至少可以帮助您更好地隔离问题,以便您的问题可以更专注,更容易回答。

标签: java sorting selection-sort anagram


【解决方案1】:

检查我在哪里修改:

public static void selectionSort(char[] arr) {

for (int i = 0; i < arr.length - 1; i++) {
    int least = i;
    for (int j = i + 1; j < arr.length; j++) {
        if (arr[j] < arr[least])
            least = j;
    }
    if (least != i) {
         int swap = arr[i];
         arr[i] = arr[least];
         arr[least] = (char) swap;

    }
  }
}

anagramCheck函数中:

x = x.trim(); // it returns trim string
y = y.trim();
x = x.toLowerCase(); // return lower-case string
y = y.toLowerCase();

【讨论】:

    【解决方案2】:

    这应该可行。但是我用了冒泡排序

    class HelloWorld {
      public static void main(String[] args) {
          System.out.println(anagramCheck("listen", "silent"));
      }
      public static boolean anagramCheck(String x, String y) {
    
        x = x.trim();
        y = y.trim();
    
        x = x.toLowerCase();
        y = y.toLowerCase();
    
        char xarr[] = x.toCharArray();
        char yarr[] = y.toCharArray();
    
        if (x.length() != y.length())
           return false;
    
        x = bubbleSort(xarr);
        System.out.println(xarr); // I used this to check if the Strings are sorted correctly
    
        y = bubbleSort(yarr);
        System.out.println(yarr);
    
        if (x.equals(y)) {
           System.out.println("It's an anagram.");
           return true;
        } else {
            return false;
        }
       }
    
       public static String bubbleSort(char[] arr) {
    
        int n = arr.length;
        for (int i = 0; i < n-1; i++){
            for (int j = 0; j < n-i-1; j++){
                if (arr[j] > arr[j+1])
                {
                    // swap arr[j+1] and arr[j]
                    char temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        
        return String.valueOf(arr);
      }
    
    }
    

    【讨论】:

    • x = x.trim(); y = y.trim(); x = x.toLowerCase(); y = y.toLowerCase();
    • 只要两个字母之间有空格,它就不再起作用了,例如“字谜”和“Nag ar am”不再被视为字谜
    猜你喜欢
    • 2013-03-09
    • 2015-12-23
    • 1970-01-01
    • 2011-01-23
    • 2021-09-19
    • 1970-01-01
    • 2012-03-16
    • 2018-10-10
    相关资源
    最近更新 更多