1593. 拆分字符串使唯一子字符串的数目最大

151 阅读1分钟

题目:
给你一个字符串 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
}