2021-02-13:字符串str最少添加多少个字符变成回文串?

福哥答案2020-02-13:

假设字符串str是“abcde12344321”,在str后添加“edcba”即可变成回文串。需要添加5个字符。

解法:包含最后一个字符的manacher算法算出长度,然后str的总长度减去manacher长度,就是需要添加的字符个数。

代码用golang编写,代码如下:、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main
 
import "fmt"
 
func main() {
    str := "abcde12344321"
    ret := ShortestEnd(str)
    fmt.Println(ret)
}
 
func ShortestEnd(s string) int {
    str := manacherString(s)
    strLen := len(str)
    pArr := make([]int, strLen)
    C := -1
    R := -1
    ret := 1
    for i := 0; i < strLen; i++ {
        if R > i {
            pArr[i] = getMin(R-i, pArr[2*C-i])
        } else {
            pArr[i] = 1
        }
        for i+pArr[i] < strLen && i-pArr[i] >= 0 {
            if str[i+pArr[i]] == str[i-pArr[i]] {
                pArr[i]++
            } else {
                break
            }
        }
        if i+pArr[i] > R {
            R = i + pArr[i]
            C = i
        }
 
        //修改
        if R == strLen {
            ret = getMax(ret, pArr[i])
            break
        }
    }
 
    //修改
    return strLen/2 - ret + 1
}
 
func manacherString(s string) string {
    ret := "#"
    sLen := len(s)
    for i := 0; i < sLen; i++ {
        ret += fmt.Sprintf("%c#", s[i])
    }
    return ret
}
 
func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}
 
func getMin(a int, b int) int {
    if a < b {
        return a
    } else {
        return b
    }
}

  

执行结果如下:

 

 

***
[左神java代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class28/Code02_AddShortestEnd.java)
[评论](https://user.qzone.qq.com/3182319461/blog/1613174556)

posted @   福大大架构师每日一题  阅读(323)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示