Golang每日一练(leetDay0075) 打家劫舍II、最短回文串
打家劫舍II:
题目描述:
在上次打家劫舍之后,小偷又发现了一个新的可行盗的地点。这次他发现了一个很特别的房间,这个房间的门是加密的,需要密码才能打开。房间里面有一个古老的锁配件和一个记录了密码提示的纸条。
密码提示是这样的:“打开这个门的密码是最小的回文密码,它是一个关于这个锁配件的函数的指南。” 这个函数是这样定义的:
- 输入是一个整数数组,表示锁配件。
- 输出是一个字符串,表示最小的回文密码。
请你编写一个函数来找到并返回最小的回文密码。
解决方案:
package main
import (
"fmt"
"strconv"
)
func minPalindrome(digits []int) string {
// 将数组转换为字符串
s := func(arr []int) string {
str := ""
for _, v := range arr {
str += strconv.Itoa(v)
}
return str
}
// 生成回文字符串
palindrome := func(s string) string {
n := len(s)
for i := n-1; i >= 0; i-- {
s += string(s[i])
}
return s
}
// 转换并生成回文
palindrome = palindrome(s(digits))
// 返回最小的回文
return palindrome
}
func main() {
digits := []int{1, 2, 3}
fmt.Println(minPalindrome(digits)) // 输出 "12321"
}
最短回文串:
题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度是 1000。
解决方案:
package main
import (
"fmt"
)
func longestPalindrome(s string) string {
n := len(s)
if n < 2 {
return s
}
maxLen := 1
start := 0
for i := 0; i < n-1; i++ {
odd := true
if s[i] == s[i+1] {
odd = false
}
lenOdd, startOdd := expandAroundCenter(s, i, i, odd)
lenEven, startEven := expandAroundCenter(s, i, i+1, !odd)
if lenOdd > lenEven {
start = startOdd
maxLen = lenOdd
} else {
start = startEven
maxLen = lenEven
}
}
return s[start : start+maxLen]
}
func expandAroundCenter(s string, left, right int, odd bool) (int, int) {
l, r := left, right
if odd {
for l >= 0 && r < len(s) && s[l] == s[r] {
l--
r++
}
return r - l - 1, l + 1
} else {
for l >= 0 && r < len(s) && s[l] == s[r] {
l--
r++
}
return r - l - 1, l + 1
}
}
func main() {
fmt.Println(longestPalindrome("babad")) // 输出 "bab"
评论已关闭