最长回文子串

最长回文子串

最长回文子串_第1张图片
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]
}

你可能感兴趣的:(算法题,动态规划,go)