链接
题目.
难度:
high
解答:
dp[i]表示以s[i]为结尾的字符串的最长可整合字符串。在这里我们用seg来表示有多少个段,其实还可以更简单,判断在m里面的max - min + 1 == len(m)此时就是满足条件的。其实这道题我们根本就不需要dp。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func convInts(ss []string) []int {
result := make([]int, len(ss))
for i, v := range ss {
res, err := strconv.Atoi(v)
if err != nil {
panic(err)
}
result[i] = res
}
return result
}
func main() {
input := bufio.NewScanner(os.Stdin)
input.Scan()
N, _ := strconv.Atoi(input.Text())
input.Scan()
str := input.Text()
strSplit := strings.Split(str, " ")
number := make([]int, N)
for i := 0; i < N; i++ {
number[i], _ = strconv.Atoi(strSplit[i])
}
fmt.Println(algo(number))
}
func algo(arr []int) int {
dp := make([]int, len(arr))
dp[0] = 1
for i, v := range arr {
if i == 0 {
continue
}
dp[i] = dp[i-1]
m := make(map[int]struct{})
m[v] = struct{}{}
seg := 1
for j := i - 1; j >= 0; j-- {
val := arr[j]
if _, ok := m[val]; ok {
break
}
m[val] = struct{}{}
_, ok1 := m[val+1]
_, ok2 := m[val-1]
if !ok1 && !ok2 {
seg++
} else if ok1 && ok2 {
seg--
}
if seg == 1 && len(m) > dp[i] {
dp[i] = len(m)
}
}
}
return dp[len(arr)-1]
}
复杂度分析
time
O(n**2)
space
O(n)