前言
字符串类型的题目,个人在一些特定语言常用的字符串方法比较容易忘记,比如长度、某个位置的字符的获取、遍历等等。
题目
一、5. 最长回文子串
这个方法我主要使用了中心扩散法,下面用圆括号标识的是特定语言(比如 Golang )的一些常见使用方法
Golang
func longestPalindrome(s string) string {
// (1). 获取字符串长度
if len(s) == 0 {
return ""
}
// 我们需要从一个字符扩展,或者从两个字符之间开始扩展
// start 和 end 是最长回文字符串的头和尾
var start, end int
// (2). 遍历字符串,它默认左边是 index 和对应的 character,如果不需要 character,可以省略,如下
for i := range s {
odd := expandAroundCenter(s, i, i)
even:= expandAroundCenter(s, i, i+1)
var len int
if odd > even {
len = odd
} else {
len = even
}
if len > (end - start + 1) {
start = i - (len-1)/2
end = i + len/2
}
}
// (3). 获取字符串的一部分,左闭右开
return s[start:end+1]
}
// 这个函数默认 left 是在正常范围内,right 可能会等于 len(s), 并且不保证 left 和 right 的值是一样的
func expandAroundCenter(s string, left int, right int) int {
// 先根据假定做好边界处理, 其实下边的 for 循环已经覆盖了 s[left] != s[right] 这种场景,这个判断已经是冗余的,但为了更明显起见,这里还是写了一下
// (4). 获取字符串在某个特定位置的 character
if right == len(s) || s[left] != s[right] {
return 1
}
// (5). golang 里边 for 循环第三部分如果有两个变量应当如下边的方式写,不能写作 "left--, right++"
for ; left >= 0 && right < len(s) && s[left] == s[right]; left, right = left - 1, right + 1 {
}
// 注意,这个地方我写错了,写成了 right - left + 1,但是要知道实际上跳出上边的 for 循环时,left 和 right 的字符已经不同或者数组越界了,所以其实应该是下面这样的
return right - left - 1
}
网友评论