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
}
解题思路
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
}
解题思路