最主要还是Java对于字符串的操作函数的使用。
关于StringBuilder的操作:
\\String:length(), 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);
本题要求:将 一个字符串 s分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
要求的输出数据:[[“a”,“a”,“b”],[“aa”,“b”]]
整个逻辑很明确,本层的宽度就是解法(可以构成回文串的分割点数),深度构成一个回文串后可以深入一层。
以下思路来自代码随想录:
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;
}
}
本题要求:就是分割给定的字符串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);
}
}
}