【问题标题】:How to convert a given string to palindrome?如何将给定的字符串转换为回文?
【发布时间】:2014-10-20 14:14:42
【问题描述】:

我有一个面试问题是:

"将给定的字符串转换为回文,提供输出 (回文字符串) 应该包含给定字符串的子字符串"

所以我这样做了,给定root 作为输入,我会找到该字符串的反转并将其附加到给定的输入。所以我得到了字符串:

roottoor

这是一个回文并且还包含 i/p (root) 存在于 o/p 中。

给定的解决方案,面试官说,它不是最优的解决方案,你能给出一个最优的解决方案吗?

除此之外我找不到任何东西。

还有其他解决方案吗?

他说需要用 Java 来完成。

【问题讨论】:

  • 非常快速的优化是只添加前n-1个字母,因为最后一个字母将成为中心,即:root -> rootoor stack -> @987654327 @ 这只是很小的一部分,不会改变解决方案的时间复杂性,所以你可能需要更多;)
  • “子串”是什么意思?就输出的长度而言,建议的解决方案以何种方式“不是最优的”?
  • 我认为rootoorroottoor
  • 你能提供你使用的代码吗?
  • 扩展@MrHug 的注释,尝试检测输入字符串的末尾是否已经包含回文,它至少是最后一个字符(如MrHug 建议的那样)。然后从头向后复制剩余的字符。

标签: java string algorithm optimization palindrome


【解决方案1】:

对于给定的字符串s,在s 的末尾找到已经是回文的最长子字符串s1。然后把s\s1的反面放在最后。

例如,对于输入字符串"lambada""ada" 是一个回文,所以你只需加上"lamb" 的倒数,结果就是"lambadabmal"

编辑:考虑到 maartinus 的回答,您还应该检查相反的方向并选择导致较短回文的方向:

对于给定的字符串s,在s 的开头找到最长的子字符串s1,它已经是一个回文。然后在开头插入s\s1的反面即可。

例如对于输入字符串"arafat""ara"是回文,所以你只需在开头插入"fat"的倒数,结果就是"tafarafat"

【讨论】:

    【解决方案2】:

    另一个答案显然错过了看开头。示例

    racecars -> racecarsracecar // when only the end is considered
    
    racecars -> sracecars       // when the start is considered
    

    只看两端,返回更好的结果。

    【讨论】:

    • 你是对的,我(错误地)只考虑在给定字符串的末尾附加一些东西。鉴于最初的问题,还必须考虑另一种可能性(在字符串的开头插入一些东西)。
    猜你喜欢
    • 2020-07-19
    • 2017-03-19
    • 2018-01-17
    • 2012-05-16
    • 2010-11-26
    • 2021-03-19
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多