【问题标题】:Rearranging one string to another in Java在 Java 中将一个字符串重新排列为另一个字符串
【发布时间】:2018-12-06 09:31:31
【问题描述】:

我正在尝试查找给定字符串 A 的一部分是否可以重新排列为给定字符串 B(布尔输出)。
由于算法必须最多为 O(n),为了简化它,我使用了 stringA.retainAll(stringB),所以现在我知道字符串 A 和字符串 B 由相同的字符集组成,现在整个任务闻起来像正则表达式。
而且.. 阅读正则表达式,我现在可能遇到两个问题(c)。
问题是,我是否可能面临通过使用正则表达式获得 O(infinity) 的风险,或者更有效地使用 StreamAPI 来查找字符串 A 的每个字符是否有足够的重复项来覆盖字符串 B 的每个字符?更不用说正则表达式语法不容易阅读和构建。
截至目前,我不能使用排序(任何排序至少为 n*log(n)),也不能使用哈希集等(因为它消除了两个字符串中的重复项)。
谢谢。

【问题讨论】:

  • Acc to stackoverflow.com/questions/24754881/… retainAll is O(n)
  • 只在HashSet,但你说你不能使用哈希。
  • @talex 没错,使用哈希消除了每个字符的出现次数。如果字符串 B 中有一个字符出现的次数多于字符串 B 中的对应字符,则 Hashset 将返回 true,但实际上为 false。

标签: java string character


【解决方案1】:

您可以使用HashMap<Character,Integer> 来计算第一个String 的每个字符出现的次数。这将需要线性时间。

然后,对于第二个String 中的每个Character,查找它是否在HashMap 中并减少计数器(如果它仍然是正数)。这也需要线性时间,如果你设法减少第二个String 的所有字符的计数器,你就成功了。

【讨论】:

  • 谢谢你,伊兰。这是否意味着我将字符串 B 中的每个字符与 HashMap 的每个元素进行比较?如果是这样,那不是 O(n^2) 吗?
  • @Shved 不,对于 B 的每个字符,您调用 Integer count = map.get(B.charAt(i)); 这需要 O(1) 时间(如果 count 不为空且 > 0,则调用 map.put(B.charAt(i),count-1),这也需要O(1) 时间)。因此总时间将是线性的。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2021-09-26
相关资源
最近更新 更多