力扣-复原IP-93

DFS+回溯

import org.junit.Test;

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

public class leetcode93 {
    int segCount = 4;   // 一共有4段
    List<String> res = new ArrayList<>();   // 保存所有可能出现的情况
    int[] segments = new int[segCount]; // 保存某一个情况

    public List<String> restoreIpAddresses(String s) {
        dfs(s, 0, 0);
        return res;
    }

    // segId表示分段的编号,segStart表示s中的下标
    public void dfs(String s, int segId, int segStart) {
        if (segId == segCount) {    // 已经有4段
            if (segStart == s.length()) {   // 字符串的长度已经用完了
                StringBuilder ipAddr = new StringBuilder();
                for (int i = 0; i < segCount; i++) {
                    ipAddr.append(segments[i]);
                    if (i != segCount - 1) {
                        ipAddr.append('.');
                    }
                }
                res.add(ipAddr.toString());
            }
            return;
        }

        // 如果未找到4段IP,就已经遍历完字符串,提前回溯
        if (segStart == s.length()) {
            return;
        }

        // 如果当前数字为0,那么它只能是0
        if (s.charAt(segStart) == '0') {
            segments[segId] = 0;
            dfs(s, segId+1, segStart+1);
        }

        // 对于一般情况
        int addr = 0;
        for (int segEnd = segStart; segEnd < s.length(); segEnd++) {
            addr = addr * 10 + (s.charAt(segEnd) - '0');
            if (addr > 0 && addr <= 255) {
                segments[segId] = addr;
                dfs(s, segId+1, segEnd+1);
            } else{
                break;
            }
        }
    }

    @Test
    public void test() {
        String s = "25525511135";
        List<String> strings = restoreIpAddresses(s);
        System.out.println(strings);
    }
}

 

posted @ 2021-08-08 20:32  Peterxiazhen  阅读(47)  评论(0编辑  收藏  举报