Algorithm 寻找真实单词的回文

Algorithm 寻找真实单词的回文,algorithm,Algorithm,我刚读了这个问题,这就引出了一些其他的回文问题。但是当我想到回文时,我想到的是真实世界的回文,它使用了一种语言中的真实单词,并且在该语言中有一定的意义 那么,如果我们放弃语法和意义太难,那么我们有什么好的算法可以在字典中找到由单词组成的回文呢?您可以将字典预处理为数据结构,使其更容易。你不能通过查找每一个可能的回文来预处理字典,除非你有办法在实际的计算时间和空间中做到这一点 假设您希望找到最多100000个字符的回文,并且您有一本包含100000个小写英语单词的词典 如果你能想出一种快速找到回文

我刚读了这个问题,这就引出了一些其他的回文问题。但是当我想到回文时,我想到的是真实世界的回文,它使用了一种语言中的真实单词,并且在该语言中有一定的意义

那么,如果我们放弃语法和意义太难,那么我们有什么好的算法可以在字典中找到由单词组成的回文呢?您可以将字典预处理为数据结构,使其更容易。你不能通过查找每一个可能的回文来预处理字典,除非你有办法在实际的计算时间和空间中做到这一点

假设您希望找到最多100000个字符的回文,并且您有一本包含100000个小写英语单词的词典

如果你能想出一种快速找到回文字谜的方法,你就可以得到额外的分数。但我不确定有没有可行的方法

编辑-似乎有一些混乱,所以我一定是不够清楚。我正在寻找回文的单词序列(长度可达100000个字符),而不是单一的字典单词,这是一个很小的问题。所以,任意数量的“a”或“i”都是回文,因为每一个都是单词,序列是回文。“amanaplanacanama”也是一个回文,因为“a”、“man”、“plan”、“canal”和“panama”是单词(如果“panama”真的在本词典中)

在C#中,我会使用LINQ转换给定的字符串

public bool isPalindrome(string str){
    var rev= new string(Enumerable.Range(1, str.Length).Select(i => str[str.Length - i]).ToArray());
    return String.Compare(str, rev, true);
}
这一部分很简单,但如果要攻击100000个字符长度,则需要对性能进行一些调整。人们可以将弦切成两半,然后翻转后半部分,以加快反转过程并缩短比较的弦

从那以后,我会将发现的所有回文转储到
IEnumerable
集合中,并根据预定义的词典对它们进行测试。。。同样,我没有提到的关键是性能

编辑:更好的性能选项(归功于)

static bool IsPalindrome(字符串s)
{
布尔回文=真;
对于(int i=0;i
这种方法假设单词是回文(可能是危险的),但会对字符串中的字母进行比较,直到不匹配为止。奇怪的字母词被处理掉了。在我上面的方法中,分成两半,你必须抓住一半+1,以便对苹果进行比较


这就是您想要的?

我在想,如果我真的想在运行时高效地检查字典,而牺牲编译时的一些工作,那么我将构建一个状态机来检查字典中是否有字母序列。我可以通过阅读每一个字典条目,然后逐字创建一个新的状态(如果不存在的话)

因此,如果词典中的第一个单词是“a”,那么在阅读“a”时从起始状态转到“a”状态将是一个有效的转换。如果下一个单词是“axe”,我会在“x”上创建一个从“a”到“ax”的转换,在“e”上创建一个从“ax”到“axe”的转换。国家“a”和“斧头”将是接受国家,而不是“斧头”

这将是一个非确定性状态机,允许从任何接受状态转换到开始状态(因为在阅读“axe”之后,我可能会读到一个“a”,而“axea”是字典中可以找到的完整单词字符串的语言)

然后,我将使用众所周知的技术将状态机优化为确定性状态机(实际上是使用其他人的代码,因为此代码肯定已经编写了1000多次)

在运行时,我将通过状态机向前运行可能的回文,如果它向前传递,则向后运行


我不知道找到回文字谜的好方法是什么

这是一个采访还是一个问题?有多少真实世界的单词包含多达100000个字符?@DMactheDestroyer我相信他的意思是,如果我们去掉语法中没有意义的上下文,你可以将字典中的真实作品合并成多达100000个字符的回文。@DanW-是的,这正是我的意思。添加了编辑,因为我显然在澄清这一点上做得很糟糕。我的道歉。@DMactheDestroyer我相信这就是全部;)它不是试图在字典中找到所有的回文单词,这很简单,而是要找到所有的回文单词序列,最多10万个字符。所以,任意数量的“a”或“i”都是回文,因为每一个都是单词,序列是回文。“amanaplanacanalama”也是一个回文,因为“a”、“man”、“plan”、“canal”和“panama”都是单词(如果“panama”真的在这本词典中的话)。你说过你想在词典中找到回文并检测它们是否是“真正的单词回文”。我不确定我是否理解你的问题。如果你想找到“真正的字典单词,在回文中,然后你会检查字典中的每个单词,如果该字符串包含字符序列-但这与回文本身无关。我想检测给定字符串是否是由给定字典中的单词组成的回文。我希望算法是有效的。我如何有效地判断“Amanaplana”是否是回文?请注意,如果字典中没有“panama”(根据我对回文的定义,它不仅要求字符串是可逆的,而且要求由两个方向的单词组成),那么它就不会被认为是一个回文。您已经知道它是一个回文。试图在这么大的回文中找到所有可能的真实单词组合是愚蠢的。回文问题的字谜主要是为了看程序员是否足够敏锐地看到手头的问题。你的问题在这个问题上是多余的
static bool IsPalindrome(string s)
{
    bool palindrome = true;
    for (int i = 0; i < s.Length / 2 + 1; i++)
    {
        if (s[i] != s[s.Length - i-1])
        {
            palindrome = false;
            break;
        }
    }
    return palindrome;
}