欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最长回文子串

程序员文章站 2022-07-13 21:58:50
...

最长回文子串

最长回文子串
babad举例子

b a b a d
b o x o x x
a x o x o x
b o x o x x
a x o x o x
d x x x x o

回文子串相当于二维数组,需要知道开始和结束位置,表中o代表是回文,横纵坐标分表代表开始和结束位置,其中有一边(开始大于结束忽略,对称的)

s 是字符串,长度用s(i,j)表示,i开始位置,j结束位置
判断s是回文,需要判断s[i] == s[j], && s[i+1, j-1]是回文
默认s[i][i]是回文

// 状态:s[i][j] 表示i到j是一个回文字符串
// 推导:s[i][j] a[i]==a[j]&&s[i+1][j-1]==true
// 初始化:s[j][j] = true

func longestPalindrome(s string) string {

	if s == "" {
		return ""
	}

	if len(s) == 1 {
		return s
	}

	flag := make([][]bool, len(s))
	str := make([]string, 0)
	str = append(str, s[0:1])
	for i := 0; i < len(s); i++ {
		flag[i] = make([]bool, len(s))
	}

	//
	for j := 1; j < len(s); j++ {
		flag[j][j] = true
		for i := 0; i < j; i++ {
			// 推导过程
			if s[j] == s[i] && (i+1 >= j-1 || flag[i+1][j-1]) {
				flag[i][j] = true
				str = append(str, s[i:j+1])
			}
		}
	}

	sort.Slice(str, func(a, b int) bool {
		return len(str[a]) < len(str[b])
	})


	return str[len(str)-1]
}