首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Anagram检查实现

Anagram检查实现
EN

Code Review用户
提问于 2018-07-13 17:52:01
回答 1查看 160关注 0票数 2

给定两个字符串时,检查两个给定字符串是否彼此相联。字符串的字元是另一个包含相同字符的字符串,只有字符的顺序可以不同。例如,“act”和“tac”是彼此的对白。输入:输入的第一行包含表示测试用例数量的整数T。每个测试用例只包含两个‘小写’字符串,在一个单独的行中。输出:如果两个字符串是anagram,则打印没有引号的"YES“,否则打印"NO”。约束条件:1≤T≤30 1≤S≤100 示例:输入:2极健忘型健忘型健忘症过敏输出:是否

我的方法:

代码语言:javascript
复制
/*package whatever //do not write package name here */

import java.util.Scanner;
import java.io.IOException;
import java.util.HashMap;

class GFG {

    private static String isAnagram (String str1, String str2)
        {
            HashMap occurs = new HashMap<>();

            if (str1.length() != str2.length())
                {
                    return "NO";
                }

            for (char ch: str1.toCharArray())
                {
                    if (!(occurs.containsKey(ch)))
                        {
                            occurs.put(ch,1);
                        }
                    else
                        {
                            int count = occurs.get(ch);
                            occurs.put(ch,count + 1);
                        }
                }

            for (char ch: str2.toCharArray())
                {
                    if (!(occurs.containsKey(ch)))
                        {
                            return "NO";
                        }
                    else
                        {
                            int count = occurs.get(ch);
                            count  = count - 1;
                            if (count < 0)
                                {
                                    return "NO";
                                }
                            else
                                {
                                    occurs.put(ch,count);
                                }
                        }
                }

        return "YES";    
        }

    public static void main (String[] args) throws IOException {
        Scanner sc = new Scanner (System.in);
        int numTests = sc.nextInt();

        for (int i = 0; i < numTests; i++)
            {
                String str1 = sc.next();
                String str2 = sc.next();
                System.out.println(isAnagram(str1, str2));
            }
    }
}

我对上述守则有以下问题:

( 1)如何进一步改善我的做法?

( 2)是否有更好的方法来解决这个问题?

( 3)我是否有严重违反守则的行为?

( 4)空间和时间复杂度能否进一步提高?

参考文献

EN

回答 1

Code Review用户

发布于 2018-07-13 18:31:16

使用HashMap使用计数系统是解决问题的一种功能方法,从算法上看,它比较好(时间复杂度为\O(N)\n)。但是,对于像这样的问题,将每个输入值规范化为排序数组或字符串比在计数HashMap中更容易。

考虑以下职能:

代码语言:javascript
复制
public static final String normalize(value) {
    if (value == null) {
        return null;
    }
    char[] chars = value.toCharArray();
    Arrays.sort(chars);
    return new String(chars);
}

现在,所有作为字谜的值都具有相同的normalize结果(它们具有相同的排序顺序)。

您的代码将简单地变成:

代码语言:javascript
复制
private static String isAnagram (String str1, String str2) {
    return Objects.equals(normalize(str1), normalize(str2));
}

请注意,在本例中,Objectsjava.util.Objects

此外,通过将规范化放入一个单独的函数中,可以减少代码中的逻辑重复。

现在,你问是否有严重的违规行为.我必须回答“是”。在Java中,将{大括号放在与代码块定义相同的行上是常见的做法。例如,您的代码:

for (char ch: str1.toCharArray()) { if (!(occurs.containsKey(ch))) { occurs.put(ch,1); } else { int count = occurs.get(ch); occurs.put(ch,count + 1); } }

应:

代码语言:javascript
复制
        for (char ch: str1.toCharArray()) {
            if (!(occurs.containsKey(ch))) {
                occurs.put(ch,1);
            } else {
                int count = occurs.get(ch);
                occurs.put(ch,count + 1);
            }
        }
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/198444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档