【问题标题】:To split a string and to check if they are anagram to each other拆分字符串并检查它们是否相互
【发布时间】:2015-05-25 07:28:05
【问题描述】:

我正在尝试解决这个问题:https://www.hackerrank.com/challenges/anagram

这是我的代码:

import java.util.*;

public class Anagram {

    public static void main(String[] args)
    {
        Scanner reader = new Scanner(System.in);
        int t = reader.nextInt();

        while((t--) > 0)
        {    
            String input = reader.nextLine();

            if((input.length()) % 2 == 1)
                System.out.println(-1);
            else
            {
                int x = input.length();
                int q = (int)(Math.floor((x / 2)));

                String input1 = input.substring(0, q);
                String input2 = input.substring(q, x);

                int [] count2 = new int[26];
                for(int i = 0; i < input2.length(); i++)
                {
                    char ch2 = input2.charAt(i);
                    count2[ch2 - 'a']++;
                }

                // int [] count1 = new int[26];
                for(int i = 0; i < input1.length(); i++)
                {
                    char ch1 = input1.charAt(i);
                    if(count2[i] > 0)
                        count2[ch1 - 'a']--;
                }

                int count = 0;
                for(int j = 0; j < 26; j++)
                {
                    count = count + Math.abs(count2[j]);
                }

                System.out.println(count);
            } 
        }
    }
} 

样本输入

6
aaabbb
ab
abc
mnop
xyyx
xaxbbbxx

预期输出

3
1
-1
2
0
1

我的输出

0
4
1
-1
2
2

谁能告诉我哪里出错了?我找不到错误...

【问题讨论】:

  • 我不懂java,java中没有办法比较char吗?我不明白你为什么要制作一个char数组?您需要做的只是遍历前半部分并检查后半部分是否匹配。
  • @ScottSelby 这也应该通过迭代第二半并检查第一半是否匹配来完成。本质上,那将是O(n^2) 算法。 OP 使用的是O(n)

标签: java java.util.scanner anagram


【解决方案1】:

你的第一个输出总是 0,因为这条线:

int t = reader.nextInt();

后跟reader.nextLine();Check this post for more details on that。为了快速修复,将该行更改为:

int t = Integer.parseInt(reader.nextLine());

现在,让我们从以下两个语句开始:

int x = input.length();
int q = (int)(Math.floor((x/2)));

那里不需要Math.floorx/2 是一个整数除法,只会给你整数结果。

移动到第二个for 循环。您使用了以下条件:

if(count2[i]>0)
    count2[ch1-'a']--;

注意到条件中的错误了吗?应该是count2[ch1 - 'a'] &gt; 0。而且,您将错过该计数不大于 0 的情况,在这种情况下您将不得不执行++。顺便说一句,因为无论如何你都在做Math.abs(),所以你不需要这个条件。只需做一个--

for( int i = 0; i < input1.length(); i++ ) {
    char ch1 = input1.charAt(i);
    count2[ch1-'a']--;
}

顺便说一句,最终结果将是count / 2,而不是count,因为count 包含从输入1 到输入2 的总不匹配,反之亦然。但我们只需要修复其中一个以匹配另一个。所以,只考虑总不匹配的一半。

【讨论】:

  • 感谢完美,顺便说一句,count2[i]>0 和 count2[ch1 - 'a'] > 0 有什么区别
  • 如果2nd 字符是'z',他们不会测试count2 数组的相同索引
  • @coder101 我不认为count 是正确的结果。您是否尝试运行代码并打印结果。应该是count / 2
  • 是的,当我保留最终结果计数时,它已提交(通过所有测试用例)
  • 请检查一下这个问题stackoverflow.com/questions/29191565/… 仍然停留在这个问题上
【解决方案2】:

您可以使用它来检查两个字符串是否为回文:

String original = "something";
String reverse = new StringBuilder(original).reverse().toString();

boolean anagram = original.equals(reverse);

【讨论】:

  • 那将是回文,而不是字谜。
  • 人们:投票系统现在有没有逆转 SO -> + 代表坏和 - 代表好?这个是如何获得 3 票的?
  • 老兄是检查回文而不是字谜
【解决方案3】:

根据您的问题,主要逻辑可以更改为如下所示。

注意 - 我只添加了主逻辑,并在此处排除了用户输入。

public static void main(String[] args) {
    String str = "acbacccbaac";
    int len = str.length();
    String str1 = null, str2 = null;
    if(len %2 != 0) {//check for odd length
        str1 = str.substring(0, len/2);
        str2 = str.substring(len/2+1, len);
    }else {//check for even length
        str1 = str.substring(0, len/2);
        str2 = str.substring(len/2, len);
    }
    char[] arr1 = str1.toLowerCase().toCharArray();
    Arrays.sort(arr1);
    char[] arr2 = str2.toLowerCase().toCharArray();
    Arrays.sort(arr2);
    if(Arrays.equals(arr1, arr2))
        System.out.println("Yes");
    else
        System.out.println("No");
}

我在 HackerRank 个人资料中针对同样的问题实施了这种方法,效果很好。

【讨论】:

    【解决方案4】:

    这是我对问题的解决方案,它有效!

    static int anagram(String s) {
            String a = "";
            String b = "";
            if (s.length() % 2 == 0) {
                a = s.substring(0, s.length() / 2);
                b = s.substring((s.length() / 2), s.length());
            }
    
            if (s.length() % 2 != 0) {
                a = s.substring(0, s.length() / 2);
                b = s.substring((s.length() / 2), s.length());
            }
            if (a.length() == b.length()) {
                char[] aArray = a.toCharArray();
                char[] bArray = b.toCharArray();
                HashMap<Character, Integer> aMap = new HashMap<Character, Integer>();
                HashMap<Character, Integer> bMap = new HashMap<Character, Integer>();
                for (char c : aArray) { // prepare a Hashmap of <char>,<count> for first string
                    if (aMap.containsKey(c)) {
                        aMap.put(c, aMap.get(c) + 1);
                    } else {
                        aMap.put(c, 1);
                    }
                }
    
                for (char c : bArray) {// prepare a Hashmap of <char>,<count> for second string
                    if (bMap.containsKey(c)) {
                        bMap.put(c, bMap.get(c) + 1);
                    } else {
                        bMap.put(c, 1);
                    }
                }
                int change = 0;
                for (Map.Entry<Character, Integer> entry : bMap.entrySet()) {
                    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
                    if (!aMap.containsKey(entry.getKey())) {
                        change += entry.getValue();
                    } else {
                        if (entry.getValue() > aMap.get(entry.getKey())) {
                            change += entry.getValue() - aMap.get(entry.getKey());
                        } else {
                            //change += entry.getValue();
                        }
                    }
                }
                return change;
            } else {
                return -1;
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      相关资源
      最近更新 更多