【问题标题】:what's number anagram which are palindromes in string [closed]什么是数字字谜,它们是字符串中的回文[关闭]
【发布时间】:2013-07-04 02:27:00
【问题描述】:

字符串中有多少是回文的字谜? 示例:字符串 = "aaabbbb"; 可能的字谜是回文“abbabba”、“bbaaabb”和“bababab”。 这里的问题是时间,我有大小为 10^9 的字符串。 这是我的最终代码,谁能告诉我它有什么问题?

【问题讨论】:

  • 嗯,三个?说真的,你需要多解释一点“你做了什么,你正在努力解决什么”。
  • 好的,给一个字符串回文的排列数是多少?
  • 向我们展示你做了什么,告诉我们你遇到了什么问题。我们想看一些代码。
  • 这里是代码:#include #include #include using namespace std; bool is_palindrome (string s){ string ss = s;反向(ss.begin(),ss.end());返回(ss == s); } int main() { string s = "aaabbbb";长长的分辨率= 0;排序(s.begin(),s.end()); do{ if(is_palindrome(s)){ cout
  • 抱歉,这样计算更好:7!/(3!*4!)=5040/144=35 是字数。检查 35 个单词中的每一个是否是回文!

标签: c++ string algorithm palindrome anagram


【解决方案1】:

输入字符串中的每个字母都必须以偶数出现,除了一个字母可以以奇数出现。这封信在回文中的位置是固定的。它必须正好在中间。假设字母 a,b,c,... 的数量是 #a, #b, #c, ...

你只关心那些字母的一半,因为在回文中,后半部分会影响前半部分。所以我们只使用了一半的字母:

我使用了 floor 函数,所以我计算了以奇数出现的字母,正确。

那么前半部分有多少排列?这是一个不同排列的例子,所以我们得到

可能性。


对于您的示例: 字符串 = "aaabbbb";

我们得到:#a=3,#b=4。因此

我们得到 3 个回文,它们是 "abbabba" 、 "bbaaabb" 和 "bababab",就像您发布的那样。


所以,如果你有一个非常大的字符串:

  1. 计算每个字母的数量
  2. 检查是否只有 1 个字母以奇数出现。它还有更多,你不能创建回文。
  3. 使用公式计算不同回文的数量。

【讨论】:

  • 谢谢 :) 我想我明白了 :))
  • 我想我还有另一个问题,如果字符串没有排序,那么我就不会像你的算法一样得到所有排列?
  • 没问题,写一个好的计数函数就行了。我建议:遍历您的输入字符串并保存已经出现的字母。您可以通过使用两个数组来做到这一点,一个包含字母(char 数组),另一个包含该字母的数量(int 数组)。如果出现新字母,只需在第一个字母中添加字母,在第二个字母中添加 1,如果出现已知字母,则在 int 数组中增加数量。
【解决方案2】:

由于字谜的每一边都必须是另一边的镜像,所以我们关心的字谜的数量基本上只是我们可以在一侧形成的字谜的数量,所以:

  1. 将字符串中的字符分组,使相同的字符组合在一起(例如,通过排序)。
  2. 检查多个字符的奇数(因此,# anagrams = 0)。
  3. 每组相同的字符取一半(奇数时截断)。
  4. 计算这些字符的唯一排列数。

【讨论】:

  • 这里的问题是计算这些字符的唯一排列数的时间,字符串的最大大小是 10^5,如果最大大小是 10^9 呢?
  • “这里的问题是计算唯一排列数的时间”计算唯一排列数不是问题,更难的问题是生成所有排列:)
  • 是的 :) 我该如何解决这个问题?
  • 给定 N 个与 M 相同的项目,唯一排列的数量是 N! /米!。
  • @Ahmed_Mohsen:您似乎跳过了第 3 步。
猜你喜欢
  • 2015-05-30
  • 2019-05-02
  • 2018-09-22
  • 2022-12-09
  • 2014-03-15
  • 2021-10-10
  • 2015-11-11
  • 1970-01-01
相关资源
最近更新 更多