java - 如何在 O(n) 时间内检查两个字符串是否是彼此的排列? ( java )

标签 java algorithm

我写了这个类,它可以检查两个给定的字符串是否是彼此的排列。但是,我的理解是它在 O(n^2) 时间运行,因为 string.indexOf() 在 O(n) 时间运行。

如何让这个程序更有效率?

import java.util.*;

public class IsPermutation{
   public void IsPermutation(){
      System.out.println("Checks if two strings are permutations of each other.");
      System.out.println("Call the check() method");
   }

   public boolean check(){
      Scanner console = new Scanner(System.in);
      System.out.print("Insert first string: ");
      String first = console.nextLine();
      System.out.print("Insert second string: ");
      String second = console.nextLine();

      if (first.length() != second.length()){
         System.out.println("Not permutations");
         return false;
      }

      for (int i = 0; i < first.length(); i++){
         if (second.indexOf(first.charAt(i)) == -1){
            System.out.println("Not permutations");
            return false;
         } 
      }
      System.out.println("permutations");
      return true;
   }
}

最佳答案

首先,可以在O(nlogn)中完成通过对两个字符串进行排序(在将它们转换为 char[] 之后),然后简单的相等性测试将告诉您原始字符串是否为排列。

O(n)可以通过创建 HashMap<Character, Integer> 来实现解决方案的平均情况,其中每个键是字符串中的一个字符,值是它出现的次数(这称为 Histogram )。在你拥有它之后,再次对两个映射进行简单的相等性检查将告诉你原始字符串是否是排列。

关于java - 如何在 O(n) 时间内检查两个字符串是否是彼此的排列? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799867/

相关文章:

java - 对 BLOB 进行操作需要太多时间

java - 在 Java 中对多个数组列表进行排序

algorithm - iOS:优化位图模糊算法

java - FindUnrelatedTypesInGenericContainer 错误示例

java - 如何进行不区分大小写的字符串替换

java - 具有优先级的 sortOn 函数

java - 可被 X 以下所有数字整除的最小可能数字的最佳算法

c++ - 从中心而不是从左、中间旋转

c - 如何从两个给定大小为 20GB 的文件中搜索常用密码?

c# - 事件选择。这样做的最佳方法是什么