题目:
给你一个字符串 s ,请你拆分该字符串,并返回拆分后唯一子字符串的最大数目。
字符串 s 拆分后可以得到若干 非空子字符串 ,这些子字符串连接后应当能够还原为原字符串。但是拆分出来的每个子字符串都必须是 唯一的 。
注意:子字符串 是字符串中的一个连续字符序列。
算法:
方法一:暴力回溯
数据量也不是很大
func maxUniqueSplit(s string) int {
n := len(s)
subStr := make(map[string]int)
var dfs func(start, end int)
ans := 0
dfs = func(start, end int) {
if end > n {
return
}
// 后面每个字符做一个子串,加起来的不重复子串数目也少于ans时,不必计算了
if len(subStr) + n - end < ans {
return
}
// 当前位置不切割子字符串
dfs(start, end + 1)
// 当前位置切割子字符串
str := s[start:end]
if _, ok := subStr[str]; ok {
dfs(start, end + 1)
} else {
subStr[str] = 1
dfs(end, end + 1)
if len(subStr) > ans {
ans = len(subStr)
// fmt.Println(subStr)
}
delete(subStr, str)
}
}
dfs(0, 1)
return ans
}