2019.12.6 LeetCode 從零單刷個人筆記整理(持續更新)
github:https://github.com/ChopinXBP/LeetCode-Babel
遞歸方法在本題上比較高效,也很容易想到。還可以依靠動態規劃的思路。
建立dp數組,dp[i]代表截至第i位字符串能夠組成的地址集合。對於第i位上的地址集合,可以遍歷前三位j,狀態轉移方程爲:
dp[i] += dp[j] + num(j,i);
其中,+=表示添加,dp[j]表示集合中不大於4位的ip地址,num(j,i)表示字符串[j+1,i]範圍構成的0-255的數字
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
給定一個只包含數字的字符串,復原它並返回所有可能的 IP 地址格式。
示例:
輸入: "25525511135"
輸出: ["255.255.11.135", "255.255.111.35"]
import java.util.ArrayList;
import java.util.List;
/**
*
* Given a string containing only digits, restore it by returning all possible valid IP address combinations.
* 給定一個只包含數字的字符串,復原它並返回所有可能的 IP 地址格式。
*
*/
public class RestoreIPAddresses {
//動態規劃
public List<String> restoreIpAddresses(String s) {
if(s.length() > 12 || s.length() < 4){
return new ArrayList<>();
}
ArrayList<ArrayList<String>>[] dp = new ArrayList[s.length() + 1];
dp[0] = new ArrayList<ArrayList<String>>(){{add(new ArrayList<>());}};
for(int i = 1; i <= s.length(); i++){
dp[i] = new ArrayList<>();
for(int j = i - 3 > 0 ? i - 3 : 0; j < i; j++){
String str = s.substring(j, i);
int num = Integer.valueOf(str);
if((str.charAt(0) == '0' && str.length() != 1) || num > 255){
continue;
}
ArrayList<ArrayList<String>> pre = dp[j];
for(ArrayList<String> prestr : pre){
if(prestr.size() > 3){
continue;
}
dp[i].add(new ArrayList<String>(prestr){{add(str);}});
}
}
}
ArrayList<String> result = new ArrayList<>();
for(ArrayList<String> strs : dp[s.length()]){
if(strs.size() != 4){
continue;
}
result.add(strs.get(0) + "." + strs.get(1) + "." + strs.get(2) + "." + strs.get(3));
}
return result;
}
//遞歸
private void restoreIpAddresses(String s, ArrayList<String> result, ArrayList<String> ip, int start) {
if (start == s.length() && ip.size() == 4) {
result.add(ip.get(0) + "." + ip.get(1) + "." + ip.get(2) + "." + ip.get(3));
return;
}
if (s.length() - start > 3 * (4 - ip.size())){
return;
}
if (s.length() - start < 4 - ip.size()){
return;
}
int num = 0;
for (int i = start; i < start + 3 && i < s.length(); i++) {
num = num * 10 + (s.charAt(i) - '0');
if (num > 255) {
break;
}
if (i > start && s.charAt(start) == '0'){
break;
}
ip.add(s.substring(start, i + 1));
restoreIpAddresses(s, result, ip, i + 1);
ip.remove(ip.size() - 1);
}
}
public ArrayList<String> restoreIpAddresses2(String s) {
ArrayList<String> result = new ArrayList<>();
ArrayList<String> ip = new ArrayList<>();
if (s == null){
return result;
}
restoreIpAddresses(s, result, ip, 0);
return result;
}
}
#Coding一小時,Copying一秒鐘。留個言點個讚唄,謝謝你#