[leetcode]Restore IP Addresses

DFS的遍历。里面的关键是两个:1.使用了合理的数据结构,用ArrayList<String>来存每一段;2.后来发现一个条件是,除了‘0’以外不能有以‘0’开头的段;

我看有的人判断比255小是先转化为数字再判断,比我这个字符串的简单。

public class Solution {

    ArrayList<String> result = new ArrayList<String>();

    ArrayList<String> section = new ArrayList<String>();

    public ArrayList<String> restoreIpAddresses(String s) {

        result.clear();

        section.clear();

        dfs(s, 0, 0);

        return result;

    }

    

    private void dfs(String s, int pos, int depth)

    {

        if (depth == 4)

        {

            int len = 0;

            for (int i = 0; i < 4; i++)

            {

                len += section.get(i).length();

            }

            if (len != s.length()) return;

            else

            {

                result.add(section.get(0) + '.' +

                            section.get(1) + '.' +

                            section.get(2) + '.' +

                            section.get(3));

            }

        }

        else

        {

            if (pos < s.length())

            {

                section.add(s.substring(pos, pos+1));

                dfs(s, pos+1, depth+1);

                section.remove(section.size()-1);

            }

            if (pos + 1 < s.length() && s.charAt(pos) != '0')

            {

                section.add(s.substring(pos, pos+2));

                dfs(s, pos+2, depth+1);

                section.remove(section.size()-1);

            }

            if (pos + 2 < s.length() && isValid(s, pos))

            {

                section.add(s.substring(pos, pos+3));

                dfs(s, pos+3, depth+1);

                section.remove(section.size()-1);

            }

        }

    }

    

    private boolean isValid(String s, int pos)

    {

        if (s.charAt(pos) == '0') return false;

        if (s.charAt(pos) > '2') return false;

        if (s.charAt(pos) < '2') return true;

        // s[pos] == '2'

        if (s.charAt(pos+1) > '5') return false;

        if (s.charAt(pos+1) < '5') return true;

        // s[pos+1] == '5'

        return (s.charAt(pos+2) <= '5');

    }

}

  

你可能感兴趣的:(LeetCode)