131. 分割回文串
代码如下
var(
path []string
res [][]string
)
func partition(s string) [][]string {
path = make([]string,0)
res = make([][]string,0)
back(s,0)
return res
}
func back(s string ,start int) {
if start == len(s) { 如果开始下标等于数组长度说明遍历完了整个数组,需要进行收集
tmp := make([]string,len(path))
copy(tmp,path)
res = append(res,tmp)
return
}
for i := start ; i < len(s) ; i++ {
str := s[start : i+1] 判断当前的数组是否为回文串
if huiwen(str) { 如果当前的是回文串 就加入路径进行下一段的判断
path = append(path,str)
back(s,i+1)
path = path[:len(path)-1]
}
}
}
func huiwen(s string)bool { 判断是否为回文串的函数
left := 0
right := len(s)-1
for left < right {
if s[left] != s[right] {
return false
}
left++
right--
}
return true
}
150. 逆波兰表达式求值
func evalRPN(tokens []string) int {
stack := []int{} 建立一个栈数组
for _,token := range tokens { 遍历目标数组
val,err := strconv.Atoi(token) 将数组的元素转为整数
if err == nil { 如果没有错误,就将数字放入栈中
stack = append(stack,val)
}else{ 如果发生错误说明,该元素是符号
num1 := stack[len(stack)-2] 取出两个元素
num2 := stack[len(stack)-1]
stack = stack[:len(stack)-2] 栈对应减少两个元素
switch token {
case "+" : 如果是加号两者相加,后面同理
stack = append(stack,(num1+num2))
case "-" :
stack = append(stack,(num1-num2))
case "*" :
stack = append(stack,(num1*num2))
case "/" :
stack = append(stack,(num1/num2))
}
}
}
return stack[0]
}
93. 复原 IP 地址
var(
path []string
res []string
)
func restoreIpAddresses(s string) []string {
path = make([]string,0)
res = make([]string,0)
back(s,0)
return res
}
func back(s string,start int) {
if len(path) == 4 { 如果等于四段,就没有必要继续递归下去
if start == len(s) { 如果遍历完整个数组,且等于四段说明这是需要的结果
str := strings.Join(path,".") 在路径当中加入.
res = append(res,str)
return
}
}
for i := start ; i < len(s) ; i++ {
if i != start && s[start] == '0' { 如果这个元素不是开头的元素,且这个元素有前导0说明错误,需要终止循环
break
}
str := s[start:i+1] 取出当前段
num,_ := strconv.Atoi(str) 将当前段变为整数
if num >=0 && num <= 255 { 如果在0-255这个范围说明合理,收集该元素
path = append(path,str)
back(s,i+1)
path = path[:len(path)-1]
}
}
}