代码随想录二刷 131. 分割回文串 150. 逆波兰表达式求值 93. 复原 IP 地址

文章介绍了三个算法问题的解决方案:1)分割回文串,通过深度优先搜索(DFS)策略检查字符串每个子串是否为回文;2)逆波兰表达式求值,利用栈数据结构处理运算符和操作数;3)复原IP地址,通过递归方法找出所有可能的四段式IP地址组合,同时确保每段在0-255范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]

          }

      }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值