二刷代码随想录|Java版|回溯算法2|分割问题

习题

2.2 分割问题

最主要还是Java对于字符串的操作函数的使用。
关于StringBuilder的操作:

\\Stringlength(), charAt
\\数组String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
StringBuilder path = new StringBuilder();\\初始化
path.append(str.charAt(i));\\增加元素
path.deleteCharAt(path.length() - 1);\\删除元素
ans.add(path.toString());\\转换为String
StringBuilder sb = new StringBuilder(10);
sb.append("Runoob..");
System.out.println(sb);  
sb.append("!");
System.out.println(sb); 
sb.insert(8, "Java");
System.out.println(sb); 
sb.delete(5,8);
System.out.println(sb); 

2.2.1 131. 分割回文串

本题要求:将 一个字符串 s分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
要求的输出数据:[[“a”,“a”,“b”],[“aa”,“b”]]
整个逻辑很明确,本层的宽度就是解法(可以构成回文串的分割点数),深度构成一个回文串后可以深入一层。
以下思路来自代码随想录:
二刷代码随想录|Java版|回溯算法2|分割问题_第1张图片

class Solution {
    List<List<String>> ans =  new ArrayList<List<String>>();
    List<String> path = new ArrayList<String>();

    public boolean isPalindrome(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;
    }
    public void backTracing(String s, int startidx){
        if(startidx == s.length()){
            ans.add(new ArrayList<String>(path));
            return;
        }

        for(int i = startidx; i<s.length(); i++){
            if(isPalindrome(s, startidx, i)){
                String str = s.substring(startidx, i + 1);
                path.add(str);
            }else{
                continue;
            }
            backTracing(s, i+1);
            path.remove(path.size() - 1);
        }

    }
    public List<List<String>> partition(String s) {
        backTracing(s, 0);
        return ans;
    }
}

2.2.2 93.复原IP地址

本题要求:就是分割给定的字符串s,要求子串满足ip地址格式(每个整数位于 0 到 255 之间组成,且不能含有前导 0)。具体输入输出示例如下:
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
这一题与上一题基本没有区别。
深度是4,宽度是此分割点–最近的三个。
写了半天,发现还是很难处理字符串。最后抄的。

class Solution {
    List<String> result = new ArrayList<String>();
	StringBuilder stringBuilder = new StringBuilder();

	public List<String> restoreIpAddresses(String s) {
		restoreIpAddressesHandler(s, 0, 0);
		return result;
	}

	// number表示stringbuilder中ip段的数量
	public void restoreIpAddressesHandler(String s, int start, int number) {
		// 如果start等于s的长度并且ip段的数量是4,则加入结果集,并返回
		if (start == s.length() && number == 4) {
			result.add(stringBuilder.toString());
			return;
		}
		// 如果start等于s的长度但是ip段的数量不为4,或者ip段的数量为4但是start小于s的长度,则直接返回
		if (start == s.length() || number == 4) {
			return;
		}
		// 剪枝:ip段的长度最大是3,并且ip段处于[0,255]
		for (int i = start; i < s.length() && i - start < 3 && Integer.parseInt(s.substring(start, i + 1)) >= 0
				&& Integer.parseInt(s.substring(start, i + 1)) <= 255; i++) {
			// 如果ip段的长度大于1,并且第一位为0的话,continue
			if (i + 1 - start > 1 && s.charAt(start) - '0' == 0) {
				continue;
			}
			stringBuilder.append(s.substring(start, i + 1));
			// 当stringBuilder里的网段数量小于3时,才会加点;如果等于3,说明已经有3段了,最后一段不需要再加点
			if (number < 3) {
				stringBuilder.append(".");
			}
			number++;
			restoreIpAddressesHandler(s, i + 1, number);
			number--;
			// 删除当前stringBuilder最后一个网段,注意考虑点的数量的问题
			stringBuilder.delete(start + number, i + number + 2);
		}
	}
}

你可能感兴趣的:(java,算法)