LeetCode093 Restore IP Addresses
来源:互联网 发布:手机端电影网站源码 编辑:程序博客网 时间:2024/04/27 06:47
详细见:leetcode.com/problems/restore-ip-addresses
Java Solution: github
package leetcode;import java.util.Arrays;import java.util.HashSet;import java.util.LinkedList;import java.util.List;/* * Given a string containing only digits, * restore it by returning all possible valid IP address combinations.For example:Given "25525511135",return ["255.255.11.135", "255.255.111.35"]. (Order does not matter) */public class P093_RestoreIPAddresses {public static void main(String[] args) {//List<String> ans = new Solution2().restoreIpAddresses("25525511135");List<String> ans = new Solution2().restoreIpAddresses("2552552563");//List<String> ans = new Solution2().restoreIpAddresses("255255255255");//List<String> ans = new Solution2().restoreIpAddresses("1231231231");//List<String> ans = new Solution2().restoreIpAddresses("1234");//List<String> ans = new Solution2().restoreIpAddresses("0000");//List<String> ans = new Solution2().restoreIpAddresses("11234");//List<String> ans = new Solution2().restoreIpAddresses("010010");tools.Utils.B_打印List_String(ans);}static class Solution {List<String> ans = new LinkedList<String>();HashSet<String> set = new HashSet<>();int[] cs = null;int[] choice = new int[12]; public List<String> restoreIpAddresses(String s) { if (s == null || s.length() < 4 || s.length() > 12) { return ans; } cs = new int[s.length()]; for (int i = cs.length - 1; i > -1; i --) { cs[i] = s.charAt(i) - '0'; } Arrays.fill(choice, - 1); int first_not_zero = 0; while (true) { if (first_not_zero > 3 || cs[first_not_zero] != 0) { break; } else { first_not_zero ++; } } if (cs.length == 4) { if (first_not_zero == 4) { ans.add("0.0.0.0"); return ans; } else { ans.add(String.format("%d.%d.%d.%d", cs[0], cs[1], cs[2], cs[3])); return ans; } } else if (first_not_zero == 0) { choice[0] = cs[0]; choice[11] = cs[cs.length - 1]; search(1, 10, 1, 1, cs.length - 2, 1); } else { for (int i = 0; i < first_not_zero * 3; i ++) { choice[i] = 0; } choice[3 * first_not_zero] = cs[first_not_zero]; choice[11] = cs[cs.length - 1]; search(3 * first_not_zero + 1, 10, 3 * first_not_zero + 1, first_not_zero + 1, cs.length - 2, first_not_zero + 1); } return ans; } // chi,chj : choice的开始和结束index // csi,csj : cs的开始和结束index private void search(int chi, int chj, int chk, int csi, int csj, int csk) { if (chk > chj || csk > csj) { isLegal(); return; } if (csj - csk > chj - chk) { return; } for (int cht = chk; cht <= chj; cht ++) { choice[cht] = cs[csk]; search(chi, chj, cht + 1, csi, csj, csk + 1); choice[cht] = -1; } }// i从0开始 boolean isLegal() { int[] parts = new int[4]; int count = 0; for (int i = 0; i < parts.length; i ++) { parts[i] = 0; int index = i * 3; boolean isAll_blank = true; int this_count = 0; for (int j = 0; j < 3; j ++) { if (choice[index + j] == -1) { continue; } isAll_blank = false; this_count ++; count ++; if (j != 0 && parts[i] == 0 && choice[index + j] != 0) { return false; } parts[i] = parts[i] * 10 + choice[index + j]; } if (parts[i] == 0 && this_count != 1) { count -= (this_count - 1); } if (isAll_blank) { return false; } if (parts[i] < 0 || parts[i] > 255) { return false; } } String temp = String.format("%d.%d.%d.%d", parts[0], parts[1], parts[2], parts[3]); if (count == cs.length && ! set.contains(temp)) { ans.add(temp); set.add(temp); } return true; }}/* * AC * 需要更加简化逻辑,现在的逻辑还是太复杂了. * 11 ms */static class Solution2 {List<String> ans = new LinkedList<String>();int[] ar = null, ch = null;// ar是输入的int[]版,ch是选择的12个数字中的一个int count = 0, arJ = 0, this_count = 0, del_count = 0;HashSet<String> set = new HashSet<>();public List<String> restoreIpAddresses(String s) {if (s == null || s.length() < 4 || s.length() > 12) { return ans; }ar = new int[s.length()];ch = new int[12];arJ = ar.length - 1;for (int i = 0; i < ar.length; i ++) {ar[i] = s.charAt(i) - '0';}Arrays.fill(ch, -1);ch[0] = ar[0];ch[ch.length - 1] = ar[ar.length - 1];int ar_i = 1;int ch_min = 1, ch_max = ch.length - 2;search(ar_i, ch_min, ch_max);return ans;}// [ar_min, ar_max] [ch_min, ch_max]void search(int ar_i, int ch_min, int ch_max) {if (this_count >= ar.length - 2) {if (judge()) {System.out.printf("第\t%d\t次数据\r\n", del_count ++);tools.Utils.printArray(ar, 20);tools.Utils.printArray(ch, 20);}return;}for (int ch_now = ch_min; ch_now <= ch_max; ch_now ++) {ch[ch_now] = ar[ar_i];this_count ++;search(ar_i + 1, ch_now + 1, ch_max);this_count --;ch[ch_now] = -1;}}boolean judge() {boolean isAllFailue = false;StringBuilder st = new StringBuilder(16);for (int i = 0; ! isAllFailue && i < 4; i ++) {int base = i * 3;if (ch[base + 0] == -1 && ch[base + 1] == -1 && ch[base + 2] == -1) {isAllFailue = true;continue;} else if (ch[base + 0] == 0 && (ch[base + 1] != 0 && ch[base + 1] != -1)) {isAllFailue = true;continue;} else if (ch[base + 0] == 0 && ch[base + 1] == 0 && ch[base + 2] != -1) {isAllFailue = true;continue;}int value = 0;boolean isFirstNot_N_1 = false;for (int j = 0; ! isAllFailue && j < 3; j ++) {if (ch[base + j] != -1) {int temp = value * 10 + ch[base + j];if (!isFirstNot_N_1 || (temp != value && value != 0)) {value = temp;} else {isAllFailue = true;}isFirstNot_N_1 = true;}}if (value < 0 || value > 255) {isAllFailue = true;}st.append(i == 0 ? "" : ".");st.append(value);}if (isAllFailue) {return false;}String now = st.toString();if (! set.contains(now)) {ans.add(now);set.add(now);return true;}return false;}}}
C Solution: github
/* url: leetcode.com/problems/restore-ip-addresses AC 0ms 87.50%*/#include <stdio.h>#include <stdlib.h>#include <string.h>typedef char* T;typedef struct al sal;typedef struct al * pal;struct al { int capacity; int size; T* arr;};pal al_init(int capacity) { pal l = (pal) malloc(sizeof(sal)); if (capacity < 1) return NULL; l->arr = (T*) malloc(sizeof(T) * capacity); l->capacity = capacity; l->size = 0; return l;}void al_expand_capacity(pal l) { T* new_arr = (T*) malloc(sizeof(T) * (l->capacity * 2 + 1)); int i = 0; for (i = 0; i < l->capacity; i ++) new_arr[i] = l->arr[i]; free(l->arr); l->arr = new_arr; l->capacity = l->capacity * 2 + 1;}void al_add_last(pal l, T v) { if (l->capacity == l->size) al_expand_capacity(l); l->arr[l->size] = v; l->size ++;}T* al_convert_to_array_free_l(pal l) { T* arr = l->arr; free(l); return arr;}void al_print(pal l) { int i = 0; if (l->size == 0) return; printf("================\r\n"); for (i = 0; i < l->size; i ++) printf("%s\r\n", l->arr[i]); printf("================\r\n"); printf("\r\n");}char* char_copy(char* r, int rn) { char* copy = (char*) malloc(sizeof(char) * rn); int i = 0; for (i = 0; i < rn-1; i ++) copy[i] = r[i]; copy[rn-1] = '\0'; return copy;}void search(pal l, char* s, int si, int sn, char* r, int ri, int rn, int cnt) { int v = 0, i = 0; if (si == sn && ri == rn && cnt == 4) { al_add_last(l, char_copy(r, rn)); return ; } if (si >= sn || ri >= rn || cnt >= 4) return; for (i = 0; i < 3 && si+i < sn; i ++) { v = v * 10 + s[si + i] - '0'; if (v > 255) break; r[ri+i] = s[si+i]; r[ri+i+1] = '.'; search(l, s, si+i+1, sn, r, ri+i+2, rn, cnt+1); if (i == 0 && v == 0) break; }} char** restoreIpAddresses(char* s, int* rn) { pal l = al_init(16); int sn = s == NULL ? 0 : strlen(s); char* r = NULL; if (sn < 4 || sn > 12) return NULL; r = (char*) malloc(sizeof(char) * (sn + 4)); search(l, s, 0, sn, r, 0, sn+4, 0); free(r); *rn = l->size; return al_convert_to_array_free_l(l);}int main() { /* 0000 ---> 0.0.0.0 00000 ---> NULL 25525511135 ---> [255.255.11.135, 255.255.111.35] 123892398 ---> [123.89.23.98, 123.89.239.8] 255255255255 ---> [255.255.255.255] */ char* s = "0000"; int rn = 0; char** a = restoreIpAddresses(s, &rn); int i = 0; for (i = 0; i < rn; i ++) { printf("%s\r\n", a[i]); free(a[i]); } free(a); return 0;}
Python Solution: github
#coding=utf-8''' url: leetcode.com/problems/restore-ip-addresses @author: zxwtry @email: zxwtry@qq.com @date: 2017年4月23日 @details: Solution: 48ms 85.48%'''class Solution(object): def search(self, v, vi, vn, r, ri, rn, a): if vi == vn and ri == rn: a.append('%d.%d.%d.%d'%tuple(r)) if vi >= vn or ri >= rn: return s = 0 for i in range(3): if i+vi >= vn: break s = s*10 + v[vi+i] if i != 0 and s < 10: break if s > 255: break r[ri] = s self.search(v, vi+i+1, vn, r, ri+1, rn, a) def restoreIpAddresses(self, s): """ :type s: str :rtype: List[str] """ sn = 0 if s == None else len(s) v = [int(s[i]) for i in range(sn)] r, a = [0]*4, [] self.search(v, 0, sn, r, 0, 4, a) return a if __name__ == "__main__": m = [ "0000", "000", "00000", "1111", "9999", "255255255255", "19216813130", "010010", ] for s in m: print(s) print(Solution().restoreIpAddresses(s)) print("============")
0 0
- LeetCode093 Restore IP Addresses
- LeetCode: Restore IP Addresses
- Restore IP Addresses
- LeetCode : Restore IP Addresses
- [LeetCode] Restore IP Addresses
- Restore IP Addresses
- [LeetCode]Restore IP Addresses
- Restore IP Addresses
- Restore IP Addresses
- LeetCode:Restore IP Addresses
- Restore IP Addresses
- Restore IP Addresses
- LeetCode Restore IP Addresses
- [leetcode] Restore IP Addresses
- Restore IP Addresses
- LeetCode:Restore IP Addresses
- [LeetCode] Restore IP Addresses
- LeetCode - Restore IP Addresses
- JDBC2和JSP初步--4月23号学习总结
- XMU 1614 刘备闯三国之三顾茅庐(二) 【逆向思维+二维并查集】
- C语言求一个序列的字典序排序
- hiho一下 第147周 小Hi的烦恼
- (2.)javaweb问题之xxx cannot be resolved to a type报错信息(总结)
- LeetCode093 Restore IP Addresses
- My sql数据库的增删改查
- 三十九、SpringBoot配置属性之Migration
- Java之函数递归
- Java DecimalFormat 用法
- 递归的理解
- 21. Merge Two Sorted Lists
- 我是如何走上"码农"的
- TeamViewer安装 windows linux MacOS chrome android ios