合法ip序列

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)

用pos[]放第i个点打的位置。然后搜索,当前节点合法,扩展节点的时候以当前的点的位置为基准,向右一位一位的增加,最多不超过3。

判断合法性要考虑每一节位数》1首位不能为0.

使用hashset判重。

boolean isValid(String s) {
        if (s == null || s.length() == 0 || s.length() > 3)
            return false;
        if (s.length() > 1 && s.charAt(0) == '0')
            return false;
        Integer i = Integer.valueOf(s);
        if (i >= 0 && i <= 255) return true;
        return false;
    }

     void search(String s, int pos[], int cur, int n, int cnt) {
        if (cur == n || cnt > 3) {
            String ip1 = s.substring(0, pos[1] + 1)
                    .concat(".");
            String ip2 = s.substring(pos[1] + 1, pos[2] + 1).concat(".");

            String ip3 = s.substring(pos[2] + 1, pos[3] + 1).concat(".");

            String ip4 = s.substring(pos[3] + 1);

            if (isValid(ip4))
                ips.add(ip1.concat(ip2).concat(ip3).concat(ip4));

            return;
        }
        for (int i = 1; i <= 3; i++) {
            if (cur + i >= n)
                continue;
            String str = s.substring(cur + 1, cur + i + 1);
            if (isValid(str)) {
                pos[cnt] = cur;
                search(s, pos, cur + i, n, cnt + 1);

            }
        }
    }

     Set<String> ips = new HashSet<String>();

    public List<String> restoreIpAddresses(String s) {
        if (s == null || s.length() == 0 || s.length() > 12 || s.length() < 4)
            return new ArrayList<String>();

        int pos[] = new int[4];
        search(s, pos, -1, s.length(), 0);
        return new ArrayList<String>(ips);

    }
时间: 2025-01-04 16:32:57

合法ip序列的相关文章

合法IP检测

**合法IP检测: 首先检测是否有非法字符, 然后检测点的数量, 然后检测是否有点在开头或结尾或有连续的点连在一起以及每个部分的位数及数值是否合法.** #include <stdio.h> #include <string.h> const int maxn = 110; char buf[maxn], buf2[maxn]; bool isValidChar(const char *str) { for (int i = 0; str[i]; ++i) if (str[i] !

判断一个字符串是否为合法IP

输入任意一个字符串,判断是否为合法IP 1 bool IsIPAddress(const char * str){ 2 //先判断形式是否合法, 3 4 //检查是否只包含点和数字 5 for(int i = 0; str[i] != '\0'; i++){ 6 if(!IsDigit(str[i]) && str[i] != '.') 7 return false; 8 } 9 10 //检查是否形如X.X.X.X 11 int count = 0; 12 for(int i = 0;

九度oj 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字

图结构练习——判断给定图是否存在合法拓扑序列

图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列. 输入 输入包含多组,每组格式如下. 第一行包含两个整数n,m,分别代表该有向图的顶点数和边数.(n<=10) 后面m行每行两个整数a b,表示从a到b有一条有向边. 输出 若给定有向图存在合法拓扑序列,则输出YES:否则输出NO. 示例输入 1 0 2 2 1 2 2 1 示例输出 YES NO #inc

图结构练习——判断给定图是否存在合法拓扑序列(sdutoj)

#include<stdio.h>#include<string.h>int d[15],map[15][15],vis[15];int main(){    int i,j,k,f,n,m,u,v;    while(~scanf("%d%d",&n,&m))    {        memset(d,0,sizeof(d));        memset(map,0,sizeof(map));        memset(vis,0,size

java 实现判断合法IP

判断一个IP是否为合法IP其实就是看其格式是否满足IP格式 这里直接用java实现 public static boolean isIP(String ip){ String Ip = ip.replaceAll(" ",""); if(Ip.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}")){ String st = Ip.split("\\."); if(Intege

九度oj 题目1342:寻找最长合法括号序列II

题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即最长的合法括号序列. 输入: 测试数据包括多个,每个测试数据只有一行,即一个随机的括号序列,该括号序列的长度保证不超过106. 输出: 对于每个测试案例,输出一个整数,表示最后剩下的最长合法括号序列长度. 样例输入: (())() (() 样例输出: 6 2 这个题和1337求的是不一样的代码如下

图结构练习——推断给定图是否存在合法拓扑序列(拓扑排序推断环)

图结构练习--推断给定图是否存在合法拓扑序列 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 给定一个有向图,推断该有向图是否存在一个合法的拓扑序列. 输入 输入包括多组.每组格式例如以下. 第一行包括两个整数n,m.分别代表该有向图的顶点数和边数.(n<=10) 后面m行每行两个整数a b.表示从a到b有一条有向边. 输出 若给定有向图存在合法拓扑序列,则输出YES.否则输出NO. 演示样例输入 1 0 2 2 1 2 2 1 演示样例输出 YES

[Jobdu] 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字