Java 字谜法没有返回正确的值。不适用于大字符串

Java 字谜法没有返回正确的值。不适用于大字符串,java,Java,这是我尝试的一种字谜法,它没有返回正确的值。它对大字符串不起作用 public boolean IsAnagram(String s,String p) { int flag=0; char c[]=s.toLowerCase().toCharArray(); char d[]=p.toLowerCase().toCharArray(); if(c.length!= d.length) { System.out.println("no"

这是我尝试的一种字谜法,它没有返回正确的值。它对大字符串不起作用

public boolean IsAnagram(String s,String p)
{
    int flag=0;

    char c[]=s.toLowerCase().toCharArray();
    char d[]=p.toLowerCase().toCharArray();

    if(c.length!= d.length)
    {
        System.out.println("no");
        //return false;
    }
    for(int i=0;i<c.length;i++)
    {
        for(int j=0;j<d.length;j++)
        {
            if(c[i]==d[j])
            {
                ++flag;

            }
        }
    }
    if(flag==c.length)
    {
       return true;
    }
    else
        return false;
}
public boolean IsAnagram(字符串s,字符串p)
{
int标志=0;
字符c[]=s.toLowerCase().toCharArray();
char d[]=p.toLowerCase().toCharArray();
如果(c.长度!=d.长度)
{
系统输出打印项次(“否”);
//返回false;
}

对于(int i=0;i您应该在此处添加
break

    for (int i = 0; i < c.length; i++) {
        for (int j = 0; j < d.length; j++) {
            if (c[i] == d[j]) {
                ++flag;
                break;
            }
        }
    }
for(int i=0;i
Peter Lawrey是对的。你不仅要检查第二个数组中的字母是否存在,还必须检查它们出现的次数是否相同。我认为排序和比较字符串是一个很好的解决方案


这里有一个奇特的解决方案:

对字符求和,如果它们相等,那么字符串就是字谜

private boolean isAnagram(String s1, String s2) {

    char a[] = s1.toLowerCase().toCharArray();
    char b[] = s2.toLowerCase().toCharArray();

    if (a.length == b.length) {
        int l = a.length; //or b.length
        int total = 0;

        for (int i = 0; i < l; i++) {
            total += a[i];
            total -= b[i];
        }
        if (total == 0)
            return true;
    }

    return false;

}
private boolean isAnagram(字符串s1、字符串s2){
char a[]=s1.toLowerCase().toCharArray();
字符b[]=s2.toLowerCase().toCharArray();
如果(a.length==b.length){
int l=a.length;//或b.length
int-total=0;
对于(int i=0;i
为什么要用这种人为的方式来解决一项简单的任务?只需使用现有的API函数即可:

public static boolean anagram(String s1, String s2) {
    char[] c1 = s1.toLowerCase().toCharArray();
    char[] c2 = s2.toLowerCase().toCharArray();
    Arrays.sort(c1);
    Arrays.sort(c2);
    return Arrays.equals(c1,c2);
}

如果您不想使用库函数,请使其尽可能简单,例如

public static boolean anagram(String s1, String s2) {
    char[] c1 = s1.toCharArray();
    char[] c2 = s2.toCharArray();
    if (c1.length != c2.length) {
        return false;
    }
    outer:
    for (char ch : c1) {
        for (int i = 0; i < c2.length; i++) {
            if (c2[i] == ch) {
                c2[i] = '\0';
                continue outer;
            }
        }
        return false;
    }
    return true;
}
public静态布尔字谜(字符串s1、字符串s2){
char[]c1=s1.toCharArray();
char[]c2=s2.toCharArray();
如果(c1.长度!=c2.长度){
返回false;
}
外部:
用于(字符ch:c1){
对于(int i=0;i
在这里,您将搜索第一个数组中的每个字符,并在第二个数组中搜索一个匹配的字符,然后“将其划掉”,这样您就不会对其进行两次计数。当然,这假定字符串中没有
'\0'
字符(这是非常不寻常的)


尽量避免复杂的“簿记”,计数器,标志等。重点放在小的逻辑步骤和不变量上。

你能提供一个不起作用的字符串示例吗?检查字谜的一个更简单的算法是对两个数组进行排序,并从中创建两个排序的字符串…然后进行简单的字符串比较。一旦你有了具有multip的字符串,我就不希望这样做了le,因为循环检查第二个字符串的全部。例如,如果
c
有一个'a',但
d
有5个'a',
标志将增加5倍。假设
d
中的其余字符在
c
中有匹配项,则仍然会得到
标志==c.length
,但它会增加5倍这将是一个错误的等价。另一个选项是计算两个字符串中每个字符的数量。当您得到两个不同长度的字符串时,您还需要返回false。不确定您为什么要将其注释掉。注意:
aab
不是
abb
的字谜,即使它具有相同的字母。我怀疑原因是ing不起作用的是;相同字符的不同数字有更多的机会。一种标准方法是对每个字符串中的字母进行排序,并查看结果是否相同。您可以使用
string.tocharray()
Arrays.sort(char[])
Arrays.equals(char[],char[])
。这很有帮助。我希望现在会有更多的案例。我怀疑
aab
abb
将被宣布为字谜,因为它们的长度相同,而且前者中的所有字母也在后者中。甚至
aab
abc
。这有很多误报。例如,“ac”和“bb”不是字谜,但是你的方法会发现它们是。链接的解决方案很花哨——对我个人的偏好来说有点花哨。为什么不只是对每个英文字母计数,并在最后比较计数呢?那么排序和比较在我看来是更好的。感谢这一点……但是,我试图在不使用内置语言的情况下解决这个问题参见我的第二个答案。