剣はoffer87を指します:IPアドレスを復元します

質問:
IPアドレスを表す数字のみを含む文字列sが与えられた場合、sから可能なすべての有効なIPアドレスを返します。回答は任意の順序で返すことができます。
有効なIPアドレスは、「。」で区切られた正確に4つの整数(それぞれ0〜255で、先頭に0はありません)で構成されます。
例:「0.1.2.201」と「192.168.1.1」は有効なIPアドレスですが、「0.011.255.245」、「192.168.1.312」、「[email protected]」は無効なIPアドレスです。
1.入力:s = "25525511135"
出力:["255.255.11.135"、 "255.255.111.35"]
2.入力:s = "0000"
出力:["0.0.0.0"]
3.入力:s = "1111 "
出力:[" 1.1.1.1 "]
4.入力:s =" 010010 "
出力:[" 0.10.0.10 "、"0.100.1.0"]

0 <= s.length <= 3000
s分析は数字のみで構成されます

IPアドレスは、3'。'文字で4つのセグメントに分割されることを特徴とし、各セグメントは0〜255の数字です。また、「0」以外の数字は0から始めることはできません。
次に、入力文字列の文字を1つずつスキャンして、IPアドレスを復元します。文字列の各数値には、通常2つのオプションがあります。最初のオプションは、現在のセグメント化された数値の末尾に文字を接続することです。スプライスされた数字が0〜255の範囲にあることを確認します。2番目のオプションは、現在の文字を新しいセグメント化された数値の開始として使用することです。
入力文字列の長さがnの場合、文字列の各文字が1つずつ処理されるため、nステップが必要であり、各ステップには2つのオプションがあります。
コード:

import java.util.LinkedList;
import java.util.List;

public class RestoreIpAddresses {
    
    
    public static void main(String[] args) {
    
    
        RestoreIpAddresses restoreIpAddresses = new RestoreIpAddresses();
        List<String> strings = restoreIpAddresses.restoreIpAddresses("10203040");
        System.out.println(strings);
    }
    public List<String> restoreIpAddresses(String s) {
    
    
        LinkedList<String> result = new LinkedList<>();
        helper(s,0,0,"","",result);
        return result;
    }

    private void helper(String s, int i, int segI, String seg, String ip, LinkedList<String> result) {
    
    
    //参数i是字符串s中当前被处理的字符下标,segI是当前分段数字的下标,因为ip地址有四个分段数字,因此参数segI的取值范围是从0到3,参数seg是当
    //前已经恢复的一个分段数字,而参数ip是当前已经恢复的ip地址。
        if (i == s.length() && segI ==3 && isValidSeg(seg)){
    
    
            result.add(ip+seg);
        }else if(i < s.length() && segI <= 3){
    
    
            char ch = s.charAt(i);
            //如果该分段符合条件
            if (isValidSeg(seg+ch)){
    
    
            //给单个分段增加数字字符
                helper(s,i+1,segI,seg+ch,ip,result);
            }
            //回溯类似存档点,从分段开始从后向前回溯
            if (seg.length() >0 &&segI<3){
    
    
            //如果分段的长度大于0,并且当前分段下标小于3,则在ip中增加该分段和.,分段数字下标加1,
                helper(s,i+1,segI+1,""+ch,ip+seg+".",result);
            }
        }

    }

    private boolean isValidSeg(String seg) {
    
    
    //如果满足分段的数字小于等于255并且该分段的首字母不等于0或者该分段只有0
        return Integer.valueOf(seg) <= 255&&(seg.equals("0")||seg.charAt(0)!='0');
    }
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Jiaodaqiaobiluo/article/details/122420881