当前位置: 首页 > news >正文

061分割回文串

分割回文串题目链接https://leetcode.cn/problems/palindrome-partitioning/description/?envTypestudy-plan-v2envIdtop-100-liked我的解答public ListListString partition(String s) { ListListString ans new ArrayList(); backtreack(s, 0, 1, new ArrayList(), ans, 0); return ans; } //last上一次分割的位置 cur当前分割的位置 public void backtreack(String s, int last, int cur, ListString output, ListListString ans, int sum){ System.out.println(cur); int sLen s.length(); if(cur sLen 1){ if(sum sLen){ ans.add(new ArrayList(output)); } return; } //分割 String left s.substring(last, cur); //left是回文串 if(valid(left)){ output.add(left); backtreack(s, cur, cur1, output, ans, sum cur - last); //回溯 output.remove(output.size() - 1); } //不分割 backtreack(s, last, cur1, output, ans, sum); } //判断字符串是否为回文串 public boolean valid(String str){ int l 0, r str.length() - 1; while(l r){ if(str.charAt(l) ! str.charAt(r)){ return false; } l; r--; } return true; }分析代码的时间复杂度为O(n^2 * 2^n)空间复杂度为O( n^2 )。解题思路每个位置分为分割和不分割两种情况假设当前位置为cur上一次分割的位置为last若s中[last,cur-1]的子串是回文字符串则当前位置可以考虑分割统计已经加入output的字符个数若分隔完s的最后一个位置判断output加入字符串的总个数是否与s的长度相等若相等则证明当前分割方法是一个可行的方法将其加入答案。看了官方题解后的解答//方法一回溯 动态规划预处理 //时间复杂度O(n*2^n)其中 n 是字符串 s 的长度。在最坏情况下s 包含 n 个完全相同的字符因此它的任意一种划分方法都满足要求。尽管动态规划预处理需要O(n^2)的时间但在渐进意义下小于O(n*2^n)因此可以忽略。 //空间复杂度O(n^2) boolean[][] f;//f[i][j]为true表示[i,j]为回文串 ListListString ans new ArrayList(); ListString output new ArrayList(); int n; public ListListString partition(String s) { n s.length(); f new boolean[n][n]; for(int i0; in; i){ Arrays.fill(f[i], true); } for(int in-1; i0; i--){ for(int ji1; jn; j){ f[i][j] s.charAt(i) s.charAt(j) f[i1][j-1]; } } dfs(s, 0); return ans; } public void dfs(String s, int cur){ if(cur n){ ans.add(new ArrayList(output)); return; } for(int icur; in; i){ if(f[cur][i]){ output.add(s.substring(cur, i1)); dfs(s, i1); output.remove(output.size() - 1); } } } //方法二回溯 记忆化搜索 //时间复杂度O(n*2^n)其中 n 是字符串 s 的长度。在最坏情况下s 包含 n 个完全相同的字符因此它的任意一种划分方法都满足要求。尽管动态规划预处理需要O(n^2)的时间但在渐进意义下小于O(n*2^n)因此可以忽略。 //空间复杂度O(n^2) int[][] f;//记忆化搜索中f[i][j] 0 表示未搜索1 表示是回文串-1 表示不是回文串 ListListString ans new ArrayList(); ListString output new ArrayList(); int n; public ListListString partition(String s) { n s.length(); f new int[n][n]; dfs(s, 0); return ans; } public void dfs(String s, int cur){ if(cur n){ ans.add(new ArrayList(output)); return; } for(int icur; in; i){ if(isPalindrome(s, cur, i) 1){ output.add(s.substring(cur, i1)); dfs(s, i1); output.remove(output.size() - 1); } } } // 记忆化搜索中f[i][j] 0 表示未搜索1 表示是回文串-1 表示不是回文串 public int isPalindrome(String s, int i, int j){ if(f[i][j] ! 0){ return f[i][j]; } if(i j){ f[i][j] 1; } else if(s.charAt(i) s.charAt(j)){ f[i][j] isPalindrome(s, i1, j-1); }else{ f[i][j] -1; } return f[i][j]; }分析​ 1、方法一的解题思路利用动态规划将字符串s的每个子串s[i,j] 是否为回文串预处理出来得到二维数组f的各个值f[i] [j]为true代表s[i,j]为回文串经过分析可以得到f的状态转移方程为​ f[i] [j] trueij​ f[i] [j] (s[i] s[j]) f[i1] [j-1]otherwise​ 然后我们从0位置开始递归寻找每种可行的分割方法假设递归到的当前位置为cur此时[0,cur-1]已经被分割成若干个回文串那么我们从cur开始遍历后续位置若[cur,i]为回文串则继续下一层递归下一层递归位置为i1即对每一个可以使得子串s[cur,i]为回文串的i都做一次分割然后继续递归判断剩下的[i,n-1]是否有可行的分割方法不断重复此操作直到字符串s遍历完。​ 2、方法二的解题思路与方法一的解题思路一致只是将判断s的每个子串s[i,j] 是否为回文串的方法由动态规划改为了记忆化搜索。​ 3、我的解答思路与官方解答的思路主要区别就在于判断子串是否为回文串的方法。总结本题主要考察判断一个字符串的任意子串是否为回文串的方法有两种判断方法分别为动态规划预处理和记忆化搜索。
http://www.rkmt.cn/news/1405581.html

相关文章:

  • 060单词搜索
  • SSHFS终极指南:5分钟掌握远程文件系统挂载的完整教程
  • 告别UE4纹理流送内存警告:深入理解r.Streaming命令族与性能调优实战
  • 如何用F3工具三步检测U盘和SD卡真实容量:告别存储欺诈
  • 2026工业设备Google推广怎么做?整合海外社媒推广类与AI外贸精准获客系统提升获客能力(附带联系方式) - 品牌2025
  • 如何突破Windows窗口限制:SRWE窗口编辑器完全指南
  • Chroma Context-1部署指南:从模型加载到代理框架集成
  • Segment-FA:解决深度包检测中正则表达式状态爆炸的创新架构
  • NuExtract-1.5-tiny-GGUF未来展望:路线图与技术发展趋势分析
  • 物联网安全基石:BORON超轻量级密码算法设计与实现解析
  • 基于整数线性规划的大模型自动并行策略:以最小化内存冗余为核心
  • 如何永久激活IDM?完整免费激活指南与脚本使用教程
  • 终极免费视频下载工具:3分钟搞定全网热门平台资源保存
  • FSearch:3分钟掌握Linux极速文件搜索,告别find命令的漫长等待
  • FlicFlac终极指南:Windows平台上最简单快速的免费音频格式转换器
  • AI智能体身份管理:从隐形风险到安全基石的实践指南
  • 别再死记Role了!用‘玩家-服务器-观众’三角关系,彻底搞懂UE4网络同步权限
  • 如何快速美化Nginx配置:终极格式化工具完全指南
  • 无人机实时动态避障:分布鲁棒加速控制屏障函数(DR-ACBF)原理与实践
  • Miner-8B-i1-GGUF社区贡献指南:如何参与模型量化与优化
  • 【PCB Layout实战】从源头到路径:构建稳健信号系统的抗干扰设计策略
  • Taotoken API Key的精细化管理与访问审计功能实践分享
  • 终极NPU部署教程:GritLM-7B-KTO在国产硬件上的高效运行方案
  • PakePlus完整指南:5分钟将网站变身为轻量级桌面和手机应用
  • 解构Java布尔类型:从栈内存到堆内存的跨越
  • LookScanned.io:三步将电子PDF变成专业扫描件
  • 为规避 Claude Code 封号风险而迁移至 Taotoken 的接入方案
  • Taotoken 为开发者提供的 OpenAI 兼容协议在迁移现有项目时的便利性体验
  • 学Agent应该先学什么?这几个底层硬技能才是通关密码
  • 广东全域高性价比办公室空间装修设计公司排行盘点 - 互联网科技品牌测评