【问题标题】:Check anagrams existence检查字谜存在
【发布时间】:2017-01-04 16:57:15
【问题描述】:

比较 2 个字符串并返回它们是否是字谜。

我有一个有效的代码:

import java.util.*;
public class HelloWorld {
  public static void main(String[] args) {
    HashMap<String, Integer> map= new HashMap<>();
    HashMap<String, Integer> map1= new HashMap<>();
    String str1 = "abaa";
    String str2 = "baaa";
    String str3 = "bbbb"; //false


      for(int i=0 ; i < str1.length(); i++){ //sr1 map
   String value = String.valueOf(str1.charAt(i));

    if (map1.containsKey(value)) {

    map1.put(value, map1.get(value) + 1);


} else {
    // No such key
    map1.put(value, 1);
}



    }


    for(int i=0 ; i < str1.length(); i++){ //str2 map
   String value = String.valueOf(str3.charAt(i));

    if (map.containsKey(value)) {

    map.put(value, map.get(value) + 1);


} else {
    // No such key
    map.put(value, 1);
}



    }

    if(map1.equals(map)){
        System.out.println("true"); //anagrams
    } else{
        System.out.println("FalsE"); //not anagrams
    }

  }
}

它应该为str1, str2FALSEstr1, str3 输出TRUE

不过,我使用 hashmaps 做到了这一点,我想知道这是否有效。 我如何计算这个效率?什么是更有效的方法?

效率:好像2个O(n)调用,hashmap调用都是O(1)。解释一下?

【问题讨论】:

  • 你无法改进 O(n),因为你必须读取字符串的每个字符,这就是 O(n)

标签: java algorithm


【解决方案1】:

您的实现的计​​算复杂度为 O(n),假设 n 是每个字符串的字符数,长度相同。你有两个操作:

  • 创建一个 HashMap 是 O(n):对于 n 个字符中的每一个,您执行一次查找和一次插入,即 O(1)
  • 比较两个 HashMap 也是 O(n):对于一个中的每个键,您在另一个中查找并比较两个值,即 O(1)

这些操作仍然在 O(n) 中运行。这假设您的 HashMap 实现对于每个存储桶没有太多的冲突。

【讨论】:

    【解决方案2】:

    在您的情况下,复杂度为 O(n)。最后的哈希比较不可能大于 O(n),在最坏的情况下复杂度可能是 3*O(n),这意味着总共 O(n)。

    我有一个改进您的解决方案的建议:

    • 您可以使用简单的 char[26] 数组代替 hashmap,因为您只有 26 个字母。
    • 由于您的数组只有 0 个值,您只需 ++array[String.valueOf(str1.charAt(i)) - 97](不需要 if/else)
    • 在第二个 for 中,为每个字符递减 --array[String.valueOf(str1.charAt(i)) - 97](不需要 if/else)
    • 对于最后一步,您将检查 26 个项目,如果找到 array[i] != 0 并返回,则打印“is not anagram”并返回...或在此之后打印“is anagram”

    它仍然是 O(n),但我认为使用的内存更少,最后一步更清晰..因为你有 O(27) 常量,即 O(1)

    已编辑:我更新了代码,因为我忘记您使用的是 java 而不是 c++,抱歉。 97 是 'a' 的 char 值,用于将 97-122 的字母标准化为 0-25

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2021-10-10
      • 2021-12-12
      • 2021-04-21
      • 2019-04-16
      • 2013-12-07
      相关资源
      最近更新 更多