题解 | #所有的回文子串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;
    }
}

从 index 开始遍历 s 的剩余部分,使用一个循环来尝试划分回文子串。对于每个划分点,使用 substring 方法获取子串,并通过调用 isHuiwen 方法来判断子串是否是回文字符串

如果是回文字符串,则将它添加到 tmp 中,然后递归地调用 dfs 方法,将 index 更新为下一个位置,继续寻找下一个回文子串。当遍历完所有划分点后,递归返回到上一层,将 tmp 中最后一个添加的回文子串移除,回溯到上一次的状态,继续进行下一次的尝试。函数 isHuiwen 判断一个字符串是否是回文字符串。

使用双指针法,从字符串两端开始向中间遍历,如果发现不相等的字符,则返回 false,否则返回 true。函数 partition 是题目要求的入口函数,它首先调用 dfs 方法进行回溯搜索,然后将结果转换为二维数组返回。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务