• 算法通关村18关 | 回溯模板如何解决分割回文串问题


    1. 分割回文串

    题目

    LeetCode131 分割回文串,给你一个字符串s,请你将s分割成一些字串,使每个字串都是回文串,返回s所有可能的分割方案。

    回文串是正着和反着读都是一样的字符串。

    思路

    知道回溯的模板,用回溯的角度思考就清晰很多:

    切割线就是图中红线切割到字符串的结尾位置,

    图中的第一次截取’a',第二次截取’aa',第三次截取'aab'。这对应的就是回溯里面,最外面的for循环,也就是横向方面。

    我们还说回溯会仍然进行递归,这里也是一样的,第一次切了'a‘,剩下的就是'ab'。递归就是再将其再切一个回文下来,也就是第二个a,剩下的'b'再交给递归进一步切割,这也就是纵向方面要干的事情,其他依次类推。

    代码

    1. List> lists = new ArrayList<>();
    2. Deque deque = new LinkedList<>();
    3. public List> partition(String s){
    4. backTracking(s,0);
    5. return lists;
    6. }
    7. private void backTracking(String s, int startIndex){
    8. //如果起始位置大于s的大小,说明找到l一组分割方案
    9. if (startIndex >= s.length()){
    10. lists.add(new ArrayList<>(deque));
    11. return;
    12. }
    13. for (int i = startIndex; i < s.length(); i++) {
    14. //如果是回文字串,则记录
    15. if (isPalindrome(s,startIndex,i)){
    16. String str = s.substring(startIndex, i + 1);
    17. deque.addLast(str);
    18. }else {
    19. continue;
    20. }
    21. //起始位置后移,保证不重复,
    22. backTracking(s,i + 1);
    23. deque.removeLast();
    24. }
    25. }
    26. //判断是否是回文字符串
    27. private boolean isPalindrome(String s, int startIndex, int end){
    28. for (int i = startIndex, j = end; i < j; i++, j--) {
    29. if (s.charAt(i) != s.charAt(j)){
    30. return false;
    31. }
    32. }
    33. return true;
    34. }
  • 相关阅读:
    GitHub构建Maven依赖仓库
    毕业设计-机器学习图像卡通动漫化图像风格迁移
    WPF动画
    造轮子之文件管理
    四种质数筛选算法总结(c++)
    使用dasviewer加载osgb模型,不显示纹理,黑乎乎的怎么解决?
    【全栈】vue3.0 + golang 尝试前后端分离【博客系统1.1】有进展了
    任何样式,javascript都可以操作,让你所向披靡
    力扣labuladong一刷day8共2题
    SkyWalking 入门教程
  • 原文地址:https://blog.csdn.net/m0_54138535/article/details/132817157