【专题:回溯】分割系列

192 阅读1分钟

131.分割回文子串

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

示例1

输入: s = "aab"
输出: [["a","a","b"],["aa","b"]]

示例2

输入: s = "a"
输出: [["a"]]

解法

func partition(s string) [][]string {
    res:=[][]string{}
    dfs131(s,0,nil,&res)
    return res
}

func dfs131(s string,index int, temp []string, res *[][]string){
    if index==len(s){
        copyTemp:=make([]string,len(temp))
        copy(copyTemp,temp)
        *res=append(*res,copyTemp)
        return
    }
    for i:=index;i<len(s);i++{
        if checkStrCore(s,index,i){
            dfs131(s,i+1,append(temp,s[index:i+1]),res)
        }
    }
    return
}

func checkStrCore(s string,left int,right int)bool{
    for left<right{
        if s[left]!=s[right]{
            return false
        }
        left++
        right--
    }
    return true
}

解题思路

131.jpg

93.复原IP地址

给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。

示例1

输入: s = "25525511135"
输出: ["255.255.11.135","255.255.111.35"]

示例2

输入: s = "0000"
输出: ["0.0.0.0"]

示例3

输入: s = "1111"
输出: ["1.1.1.1"]

示例4

输入: s = "010010"
输出: ["0.10.0.10","0.100.1.0"]

示例5

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

解法

func restoreIpAddresses(s string) []string {
    res:=[]string{}
    dfs(s,0,nil,&res)
    return res
}

func dfs(s string, index int, temp []string, res *[]string ){
     if index == len(s) && len(temp)==4{
         copyTemp:=make([]string,len(temp))
         copy(copyTemp,temp)
         a:=strings.Join(copyTemp,".")
         *res=append(*res,a)
         return 
     }
     for i:=index;i<len(s);i++{
         if checkIP(s,index,i) && i-index+1<=3 && len(temp)<=4{
            dfs(s,i+1,append(temp,s[index:i+1]),res)
         }
     }
}

func checkIP(s string, left int, right int)bool{
    if s[left]=='0'&&right-left+1>1{
        return false
    }
    intIP,_:=strconv.Atoi(s[left:right+1])
    if intIP<0 || intIP>255{
        return false
    }
    return true
}

解题思路

93.jpg