Day21 | 131分割回文串&93复原 IP 地址

94 阅读1分钟

分割回文串 LeetCode 131

题目链接:[LeetCode 701 - 中等]

思路

回溯中的分割问题: 按照题目的意思,首先得判断是否为回文串,然后进行回溯。

回溯:

class Solution {
    List<List<String>> result = new ArrayList<>();
    List<String> res = new LinkedList<>();
    public List<List<String>> partition(String s) {
        backtracking(s,0);
        return result;
    }
    private void backtracking(String s,int index){
        if(index >= s.length()){
            result.add(new ArrayList(res));
            return;
        }
        for(int i=index;i<s.length();i++){
            if(isPalidrome(s,index,i)){
                String str = s.substring(index,i+1);
                res.addLast(str);
            }else{
                continue;
            }
            backtracking(s,i+1);
            res.removeLast();
        }
    }
    private boolean isPalidrome(String s,int start,int end){
        for(int i=start,j=end;i<j;i++,j--){
            if(s.charAt(i)!=s.charAt(j))return false;
        }
        return true;
    }
}

复原 IP 地址 LeetCode 93

题目链接:[LeetCode 93 - 中等]

思路

该题需要实现两个:验证是否合法+回溯 一些技巧:①char的值转化为int:s.charAt(i)-'0'②不使用stringbuilder:s = s.substring(0,i+1) + "." + s.substring(i+1);

回溯:

class Solution {
    List<String> result = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        backtracking(s,0,0);
        return result;
    }
    private void backtracking(String s,int startIndex,int numPoint){
        if(numPoint == 3){
            if(isValid(s,startIndex,s.length()-1)){
                result.add(s);
            }
        }
        for(int i=startIndex;i<s.length();i++){
            if(isValid(s,startIndex,i)){
                numPoint++;
                s = s.substring(0,i+1) + "." + s.substring(i+1);
                backtracking(s,i+2,numPoint);
                numPoint--;
                s = s.substring(0,i+1) + s.substring(i+2);
            }
        }
    }
    private boolean isValid(String s,int start,int end){
        if(start > end)return false;

        if(s.charAt(start)=='0'&& start!=end){
            return false;
        }
        int num = 0;
        for(int i=start;i<=end;i++){
            if(s.charAt(i)>'9' || s.charAt(i)<'0')return false;
            num = num*10 + (s.charAt(i)-'0');
            if(num > 255){
                return false;
            }
        }
        return true;
    }
}