生活随笔
收集整理的這篇文章主要介紹了
[Leetcode][第93题][JAVA][复原IP地址][剪枝][回溯]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】[中等]
【解答思路】
1. 遞歸 回溯剪枝
復雜度
class Solution {static final int SEG_COUNT
= 4;List
<String> ans
= new ArrayList<String>();int[] segments
= new int[SEG_COUNT
];public List
<String> restoreIpAddresses(String s
) {segments
= new int[SEG_COUNT
];dfs(s
, 0, 0);return ans
;}public void dfs(String s
, int segId
, int segStart
) {if (segId
== SEG_COUNT
) {if (segStart
== s
.length()) {StringBuffer ipAddr
= new StringBuffer();for (int i
= 0; i
< SEG_COUNT
; ++i
) {ipAddr
.append(segments
[i
]);if (i
!= SEG_COUNT
- 1) {ipAddr
.append('.');}}ans
.add(ipAddr
.toString());}return;}if (segStart
== s
.length()) {return;}if (s
.charAt(segStart
) == '0') {segments
[segId
] = 0;dfs(s
, segId
+ 1, segStart
+ 1);}int addr
= 0;for (int segEnd
= segStart
; segEnd
< s
.length(); ++segEnd
) {addr
= addr
* 10 + (s
.charAt(segEnd
) - '0');if (addr
> 0 && addr
<= 0xFF) {segments
[segId
] = addr
;dfs(s
, segId
+ 1, segEnd
+ 1);} else {break;}}}
}
2. 三重循環暴力遍歷
i、j、j分別表征分隔點的位置,比如255|255|255|255,i,j,k分別為2、5、8;分割成子字符串,并且轉換成數字;判斷是否合理:1)數字是否小于等于255,2)連續0的個數只能為1 && 非0數字不能以0開頭
import java
.util
.*
;class lc93 {static List
<String> res
= new ArrayList<>();public List
<String> restoreIpAddresses(String s
) {int len
= s
.length();if (len
> 12) return res
;for (int i
= 0; i
< len
- 3; i
++) {int num1
= Integer
.parseInt(s
.substring(0, i
+ 1));if (num1
> 255 || getLen(num1
) != i
+ 1) continue;for (int j
= i
+ 1; j
< len
- 2; j
++) {int num2
= Integer
.parseInt(s
.substring(i
+ 1, j
+ 1));if (num2
> 255 || getLen(num2
) != j
- i
) continue;for (int k
= j
+ 1; k
< len
- 1; k
++) {int num3
= Integer
.parseInt(s
.substring(j
+ 1, k
+ 1));if (num3
> 255 || getLen(num3
) != k
- j
) continue;int num4
= Integer
.parseInt(s
.substring(k
+ 1, len
));if (num4
> 255 || getLen(num4
) != len
- k
- 1) continue;String temp
= num1
+ "." + num2
+ "." + num3
+ "." + num4
;res
.add(temp
);}}}return res
;}int getLen(int num
) {if (num
== 0)return 1;
return (int) (Math
.log(num
) / Math
.log(10)) + 1;}
}
【總結】
1. 全排列回溯法模板回顧
if 滿足結束條件
:result
.add(路徑
)return
for 選擇 in 選擇列表
:#排除不合法的選擇d將該選擇從選擇列表移除(used數組
/條件限制)# 做選擇路徑
.add(選擇
)backtrack(路徑
, 選擇列表
)# 撤銷選擇路徑
.remove(選擇
)
2.回溯剪枝 定義出口 剪枝(排除條件+特有情況 ) 一般情況
if (segStart == s.length()) //提前終止if (s.charAt(segStart) == ‘0’) // 由于不能有前導零,如果當前數字為 0,那么這一段 IP 地址只能為 0
3. First make it work, then make it right, and, finally, make it fast.
首先使其正常運行,然后使其正確,最后使其快速。
先寫暴力,然后再優化。
轉載鏈接:https://leetcode-cn.com/problems/restore-ip-addresses/solution/fu-yuan-ipdi-zhi-by-leetcode-solution/
參考鏈接:https://leetcode-cn.com/problems/restore-ip-addresses/solution/hui-su-suan-fa-hua-tu-fen-xi-jian-zhi-tiao-jian-by/
總結
以上是生活随笔為你收集整理的[Leetcode][第93题][JAVA][复原IP地址][剪枝][回溯]的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。