【问题标题】:Check whether two String's are anagram检查两个字符串是否是字谜
【发布时间】:2016-04-07 02:00:09
【问题描述】:

我写了一个方法来检查两个字符串是否是字谜。即使单词不是字谜,该方法也会返回 true。我在代码中看不到任何错误,有什么想法可以改进吗?方法如下,

public static boolean checkAnagram( String one, String two){

    if ( one.length() != two.length() ) 
        return false;

    char[] letters  = new char[128];

    for ( char c: one.toCharArray()){

        letters[c]++;
    } 


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

        int c = (int) two.charAt(j);

        if( --letters[c] < 0) return false;

    }

    return true;
}

【问题讨论】:

  • 我不确定这个算法究竟是如何工作的,但只是我个人的看法:使用toCharArray(),按字母顺序排序,然后比较数组。
  • 我知道的其他方法很少,我只想知道为什么这个小代码不起作用。该算法使用字符的 ASCII 值来跟踪字符。

标签: java anagram


【解决方案1】:

letters 是一个char 数组,所以letters[i] 永远不会是负数(char 的范围是02^16-1)。如果您尝试将其减少到 0 以下,它将下溢到Character.MAX_VALUE。将其更改为int[]

【讨论】:

  • 谢谢,我在仔细查看时也发现了这一点。
【解决方案2】:

在您使用的第一个 for 循环中:

letters[c]++;

cchar
在另一个 for 循环中,通过在将其分配给 c 之前执行 (int)two.charAt(j),将 cast c 循环到 int

此外,您每次都会得到true,因为char 数组中不能有负值,因此在每个索引处都存在letters[index] &gt;= 0。您需要将数组更改为int[128]

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 2019-05-02
    • 2013-08-18
    • 2021-10-10
    • 2018-09-22
    • 2015-05-30
    • 2016-03-21
    相关资源
    最近更新 更多