Java 题解 | #所有的回文子串I#
所有的回文子串I
https://www.nowcoder.com/practice/37fd2d1996c6416fa76e1aa46e352141
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串二维数组
*/
List<List<String>> res = new ArrayList<>();
List<String> tmp = new ArrayList<>();
private void dfs(int index, String s) {
if (index == s.length()) {
res.add(new ArrayList<>(tmp));
return;
}
for (int i = index; i < s.length(); i++) {
String substring = s.substring(index, i + 1);
if (isHuiwen(substring)) {
tmp.add(substring);
dfs(i + 1, s);
tmp.remove(tmp.size() - 1);
}
}
}
private boolean isHuiwen(String s) {
int begin = 0;
int end = s.length() - 1;
while (begin <= end) {
if (s.charAt(begin) != s.charAt(end)) {
return false;
}
begin++;
end--;
}
return true;
}
public String[][] partition(String s) {
int n = s.length();
dfs(0, s);
String[][] result = new String[res.size()][];
for (int i = 0; i < res.size(); i++) {
result[i] = res.get(i).toArray(new String[0]);
}
return result;
}
}
Java编程语言。
这道题考察的是回溯算法。题目要求根据给定的字符串 s,将其划分成一组回文子串,并返回所有可能的划分方式。
代码的文字解释如下:
首先判断 index 是否等于 s 的长度,如果是,则说明已经遍历完了整个字符串,将 tmp 添加到 res 中,并返回。
从 index 开始遍历 s 的剩余部分,使用一个循环来尝试划分回文子串。对于每个划分点,使用 substring 方法获取子串,并通过调用 isHuiwen 方法来判断子串是否是回文字符串
如果是回文字符串,则将它添加到 tmp 中,然后递归地调用 dfs 方法,将 index 更新为下一个位置,继续寻找下一个回文子串。当遍历完所有划分点后,递归返回到上一层,将 tmp 中最后一个添加的回文子串移除,回溯到上一次的状态,继续进行下一次的尝试。函数 isHuiwen 判断一个字符串是否是回文字符串。
使用双指针法,从字符串两端开始向中间遍历,如果发现不相等的字符,则返回 false,否则返回 true。函数 partition 是题目要求的入口函数,它首先调用 dfs 方法进行回溯搜索,然后将结果转换为二维数组返回。
查看10道真题和解析