1. 分割回文串
131.分割回文串
力扣题目链接(opens new window)
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]
1. 分割问题的一般解法
以本题为例,总结出分割问题的一般解法
循环是:将切掉的是[startIndex,i],余的是[i+1,length],下一次循环 startIndex=i+1
判断时: startIndex前面的全被且了(不包括自己)
2. 代码
private List<String> spath=new ArrayList<>();
private List<List<String>> sres=new ArrayList<List<String>>();
//12. 分割回文串
public List<List<String>> partition(String s) {
partitionTracebacking(s,0);
return sres;
}
public void partitionTracebacking(String s,int startIndex) {
if (startIndex==s.length()){
sres.add(new ArrayList<>(spath));
return;
}
for (int i = startIndex; i <s.length() ; i++) {
if (!isHuiWen(s.substring(startIndex,i+1))){
continue;
}
spath.add(s.substring(startIndex,i+1));
partitionTracebacking(s,i+1);
spath.remove(spath.size()-1);
}
}
/**
* 判断是否是回文串
* @param str
* @return
*/
public boolean isHuiWen(String str){
char[] chars = str.toCharArray();
int p=0,q=chars.length-1;
while (q>p){
if (chars[p]!=chars[q]){
return false;
}
p++;
q--;
}
return true;
}
3. 优化
分割回文串可以使用动态规划法进行优化
2. 分割ip地址
力扣题目链接(opens new window)
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。
示例 1:
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
1. 思路
- 循环终止条件
path.length4—> 切割完成(startIndexlength) - 剪枝条件 i不能超过3步
先尝试区切[startIndex,i],如果不符合条件(
大于255小于0,特殊符号,多位时0开头
)直接continus; - 剪枝时什么时候continus, 什么时候 return,可以画图模拟得出
2. 代码
private List<String> res=new ArrayList<>();
// 17. 复原ip
public List<String> restoreIpAddresses(String s) {
restoreIpAddressesTB(s,0,new ArrayList<String>());
return res;
}
public void restoreIpAddressesTB(String s,int startIndex,List<String> path) {
if (path.size()==4){
if (startIndex==s.length()){
StringBuilder sb = new StringBuilder();
for (String s1 : path) {
sb.append(s1);
}
res.add(sb.toString());
}
return ;
}
for (int i = startIndex; i <startIndex+3&&i<s.length() ; i++) {
String substring = s.substring(startIndex, i + 1);
// 剪枝
// 不包含特殊字符
for (int j = 0; j < substring.length(); j++) {
char c = substring.charAt(j);
if (j==0&&substring.length()>1&&c=='0'){
return;
}
if (!('0'<=c&&c<='9')){
return;
}
}
int ip = Integer.parseInt(substring);
if (!(ip>=0&&ip<=255)){
// System.out.println(ip);
return;
}
if (path.size()==3){
path.add(substring);
}else {
path.add(substring+'.');
}
restoreIpAddressesTB(s,i+1,path);
path.remove(path.size()-1);
}
}