【问题标题】:I don´t find the mistake of my code to check strings for anagram [closed]我没有发现我的代码检查字谜字符串的错误[关闭]
【发布时间】:2019-05-13 20:23:34
【问题描述】:

我必须编写一个代码来测试,如果字符串一个是另一个字符串的字谜。但是我的代码不起作用。结果我每次都是假的。谁能解释我的错误在哪里?

public boolean anagram (String s1, String s2) {
    count = 0;
    for(int i = 0; i !=-1; i++) {
        if(s1.indexOf(s2.charAt(i)) != -1) {
        count++;
        temp = Integer.toString(s1.indexOf(s2.charAt(i)));
        s1.replace(temp,"");
    } if(count+1 == s1.length())
        return a == true;
    }

    return a == false;

【问题讨论】:

  • 什么是a?如果a 为真,那么a == true 是什么?还有,a == false是什么?
  • @mkasberg 好点。
  • @P.Soutzikevich 与此处尝试的解决方案相比,那里的答案要好得多。如果字母多次出现,恕我直言,此方法可能会不一致。
  • @HerbWolfe 可能与my comment just above yours 重复:P

标签: java string anagram


【解决方案1】:

我的解决方案不会修改不可变的Strings(即创建新的修改后的字符串实例)和大小为 26 的临时数组:

public static boolean isAnagram(String one, String two) {
    one = one != null ? one.toLowerCase() : "";
    two = two != null ? two.toLowerCase() : "";

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

    int[] arr = new int[26];

    for (int i = 0; i < one.length(); i++)
        arr[one.charAt(i) - 'a']++;
    for (int i = 0; i < two.length(); i++)
        arr[two.charAt(i) - 'a']--;
    for (int ch : arr)
        if (ch != 0)
            return false;

    return true;
}

【讨论】:

  • 我喜欢这个。不过,对这些数组中发生的事情的简短解释将有助于不太精明的人。
【解决方案2】:

试试这样的:

public boolean anagram (String s1, String s2) {
    int count = 0;
    boolean a = false;
    for (int i = 0; i < s2.length(); i++) {
        int s1index = s1.indexOf(s2.charAt(i));
        if (s1index != -1) {
        count++;
        s1 = s1.replaceFirst(String.valueOf(s1.charAt(s1index)),"");
        } 
    }
    if ((count == s2.length()) && (s1.length() == 0))
        a = true;
    return a;
    }

基本上,测试应该在函数末尾和for 循环之外进行,并且您希望返回a 的布尔值,而不是a == true 的布尔值(应该是总是false,因为a 从未在您的代码中分配true 值)。

编辑:我在最初的答案中更正了两个错误,并添加了希望消除字母多次出现问题的代码(这就是为什么我的第一个答案在某些情况下不起作用的原因)。此代码修改 s1 字符串 - 如果您不希望这样做,只需在函数开头执行 s1temp = s1; 并将 s1 替换为 s1temp 用于函数的其余部分。该代码还使用字符串的 replaceFirst() 方法 - 因为据我所知,replace 方法会删除 all 出现的字母,但您可以切换到从字符串中删除字符的其他替代方法(有关详细信息,请参阅this question)。顺便说一句,您的 temp 方法错误地尝试替换字符的 index,而不是实际字符,更不用说 i !=-1 测试在 @987654338 中没有意义这一事实从 0 开始递增 i 的 @ 循环。

注意:您可以验证它是否正常工作(每个步骤都打印在屏幕上)here(在线 Java 编译器)。

【讨论】:

  • 谢谢你的表达:)。解决方案有效:)
  • 请考虑选择此答案作为您问题的解决方案,并为用户为解决您的问题所做的努力投票:) 祝您有美好的一天!
  • @BastianoCoimbra 不客气 - 祝你在学校好运 ;)
  • 如果我测试字符串“anna”和“aaaa”,这段代码也会返回 true。但为什么 ?我无法理解这一点。因为它应该停止 count++,在他删除了 anna 的 2 个 a 之后,当他尝试查找下一个字符时应该停止,因为它应该返回 -1。
  • @BastianoCoimbra 我已经更新了我的答案以尝试纠正您提到的问题 - 如果它有效,请告诉我。抱歉耽搁了,我忙了一整天:)
猜你喜欢
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2018-09-22
  • 2022-08-18
  • 2021-12-12
  • 2021-06-04
  • 2016-05-02
相关资源
最近更新 更多