leetcode_93_复原ip地址

本文介绍了一种通过暴力破解方法来解决复原IP地址的问题,详细解释了如何将一个由数字组成的字符串转换为所有可能的IP地址格式。通过三重循环遍历字符串,确保每部分都符合IP地址的有效范围。

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

老样子,先上题目:

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。

 

示例:

输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/restore-ip-addresses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路:

题目看上去比较难,但其实思路比较简单。在这里直接使用暴力破解即可23333333:

因为要分割成四段,所以需要三重循环即可,逐个遍历。

时间复杂度为O(n^3),空间复杂度为O(1)

应该还有复杂度更加低的方法,本人比较菜,所以这里不扩展了233333


实现:(又一次感受到了java与c++/c之间的速度之差555)

JAVA版:

package leetcode;

import java.util.ArrayList;
import java.util.List;

/*
USER:LQY
DATE:2020/8/9
TIME:8:31
*/
public class leetcode_93 {

    public static void main(String []args){
        String s = "25525511135";
        List<String> ans = new leetcode_93().restoreIpAddresses(s);
        for(String d : ans){
            System.out.println(d);
        }
    }
    public List<String> restoreIpAddresses(String s) {
        List<String> ans = new ArrayList<>();

        int n = s.length();
        if(n < 4) return ans;
        if(n == 4){
            String t = "";
            for(int i = 0;i < n-1;i++)
                t += s.charAt(i) + '.';
            t += t.charAt(n-1);
            ans.add(t);
            return ans;
        }
//        int []index = {1, 2, 3};
        System.out.println("start");
        for(int i = 1;i<=3 && i<n;i++){
            String s1 = s.substring(0, i);
            if(Integer.valueOf(s1) > 255) {
                System.out.println("s1 "+s1+" out of the range");
//                break;
                continue;
            }
            for(int j = i+1;j<=i+3 && j<n;j++){
                String s2 = s.substring(i, j);
                if(Integer.valueOf(s2) > 255) {
                    System.out.println("s2 "+s2+" out of the range");
//                    break;
                    continue;
                }
                for(int k = j+1;k<=j+3 && k<n;k++){

                    String s3 = s.substring(j, k);
                    if(n-k > 3) continue;
                    String s4 = s.substring(k, n);

                    if(s3=="" || s4=="" || Integer.valueOf(s3)>255 || Integer.valueOf(s4)>255) {
                        System.out.println("s3 "+s3+" or s4 "+s4+" out of the range");
//                        break;
                        continue;
                    }
                    if(!judge(s1) || !judge(s2) || !judge(s3) || !judge(s4)) continue;
                    //此时添加
                    String t = "";
                    for(int m = 0;m < n;m++){
                        if(m==i-1 || m==j-1 || m==k-1){
                            t += s.charAt(m) + ".";
                        }else{
                            t += s.charAt(m);
                        }
                    }
                    System.out.println("get:"+t);
                    ans.add(t);
                }
            }
        }


        return ans;
    }
    boolean judge(String s){
        int n = s.length();
        if(n==2 && Integer.valueOf(s)<10) return false;
        if(n==3 && Integer.valueOf(s)<100) return false;

        return true;
    }
}

C++版:

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        vector<string> ans;
        int n = s.size();
        if(n < 4) return ans;
        if(n == 4){
            string t = "";
            for(int i = 0;i < n-1;i++){
                t += s[i];
                t += '.';
            }
            t += s[n-1];
            ans.push_back(t);
            return ans;
        }
        // c++中的stubstr(p1, p2)与java中的不一样,
        // c++中的p1指示起始位置,p2指示字符数目。
        // 即从p1处开始的p2个字符。
        for(int i = 1;i<=3 && i<n;i++){
            string s1 = s.substr(0, i);
            if(stol(s1) > 255){
                // cout<<"s1 "<<s1<<" out of the range"<<endl;
                continue;
            }

            for(int j = i+1;j<=i+3 && j<n;j++){
                string s2 = s.substr(i, j-i);
                if(stol(s2) > 255){
                // cout<<"s2 "<<s2<<" out of the range"<<endl;
                continue;
                }

                for(int k = j+1;k<=j+3 && k<n;k++){
                    string s3 = s.substr(j, k-j);
                    if(n-k > 3) continue;
                    string s4 = s.substr(k, n-k);
                    if(stol(s3)>255 || stol(s4)>255){
                        // cout<<"s3 "<<s3<<" or s4 "<<s4<<" out of the range"<<endl;
                        continue;
                    }
                    if(!judge(s1) || !judge(s2) || !judge(s3) || !judge(s4)) continue;
                    // cout<<"add"<<endl
                    string t = "";
                    for(int m = 0;m < n;m++){
                        if(m==i-1 || m==j-1 || m==k-1){
                            t += s[m];
                            t += ".";
                        }else{
                            t += s[m];
                        }
                    }
                    cout<<t;
                    ans.push_back(t);
                }
            }
        }

        return ans;
    }
    bool judge(string s){
        int n = s.size();
        if(n==2 && stol(s)<10) return false;
        if(n==3 && stol(s)<100) return false;

        return true;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值