每日AC--leetCode--PalindromePartitioning--回溯法 递归实现
来源:互联网 发布:淘宝优惠券兑换链接 编辑:程序博客网 时间:2024/05/16 04:41
每日AC--leetCode--PalindromePartitioning--回溯法 递归实现
题目描述
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s ="aab",
Return
[ ["aa","b"], ["a","a","b"]
AC 代码:
/** * 版权所有 (c) 2017,xiaoming有限公司 */package algorithm;import java.util.ArrayList;/** * 类说明 * * <pre> * Modify Information: * Author Date Description * ============ =========== ============================ * DELL 2017年9月15日 Create this file * </pre> * */public class LeetCodePalindromePartitioning { // 看似字符串切分,实则可以考虑回溯法实现 /** * 先看下回溯法实现 递归与非递归 int a[n],i; 2: 初始化数组a[]; 3: i = 1; 4: while (i>0(有路可走) and (未达到目标)) // 还未回溯到头 5: { 6: if(i > n) // 搜索到叶结点 7: { 8: 搜索到一个解,输出; 9: } 10: else // 处理第i个元素 11: { 12: a[i]第一个可能的值; 13: while(a[i]在不满足约束条件且在搜索空间内) 14: { 15: a[i]下一个可能的值; 16: } 17: if(a[i]在搜索空间内) 18: { 19: 标识占用的资源; 20: i = i+1; // 扩展下一个结点 21: } 22: else 23: { 24: 清理所占的状态空间; // 回溯 25: i = i –1; 26: } 27: } 递归实现: int a[n]; 2: try(int i) 3: { 4: if(i>n) 5: 输出结果; 6: else 7: { 8: for(j = 下界; j <= 上界; j=j+1) // 枚举i所有可能的路径 9: { 10: if(fun(j)) // 满足限界函数和约束条件 11: { 12: a[i] = j; 13: ... // 其他操作 14: try(i+1); 15: 回溯前的清理工作(如a[i]置空值等); 16: } 17: } 18: } 19: } * @param * @return */ ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>(); public ArrayList<ArrayList<String>> partition(String s) { ArrayList<String> list = new ArrayList<String>(); findisPalindrome(s,0,list); return result; } /** * @param s * @param i * @param list * @return */ private void findisPalindrome(String s, int start, ArrayList<String> list) { if(start>= s.length()&& !list.isEmpty()){ result.add(new ArrayList(list));// 这个比较关键否则的话,如果是result.add(list)是不行的 必须New 一个 }else{ for(int end = start; end<=s.length(); end++){ String str = s.substring(start,end); if(isPalindrome(str)){ list.add(str); findisPalindrome(s,end,list); list.remove(list.size()-1);//回退 进入下一个 } } } } /** * @param args */ public static void main(String[] args) { String s = "aab"; ArrayList<ArrayList<String>> resultList = new LeetCodePalindromePartitioning().partition(s); for(int i = 0; i< resultList.size(); i++){ System.out.println(resultList.get(i).toString()); } } /** * 判断回文字符串 * @param str * @return */ public boolean isPalindrome(String str) { if(str.isEmpty()) return false; boolean result = true; for (int i = 0, j = str.length() - 1; i < j; i++, j--) { if (str.charAt(i) != str.charAt(j)) { result = false; break; } } return result; }}
阅读全文
0 0
- 每日AC--leetCode--PalindromePartitioning--回溯法 递归实现
- LeetCode PalindromePartitioning
- 每日AC--leetcode--recordList
- 每日AC--LeetCode-Candy
- 每日AC--gas-station--LeetCode
- LeetCode: Combinations 递归回溯 2种实现方法
- 车厢调度(回溯法)递归实现
- 回溯法 ----- 递归的一种实现
- 用回溯法递归实现迷宫
- leetcode--递归、回溯和分治
- 每日AC--leetcode-- 2.Add Two Numbers
- 每日AC--LeetCode-- wordBreak--动态规划
- 八皇后 回溯递归实现
- 递归回溯法排序
- 递归和回溯法
- 递归实现回溯法求n皇后问题
- 背包问题回溯法的递归实现(java)
- 数据结构 迷宫的非递归实现(回溯法)
- vue-cli下bootstrap配置
- Linux 基础
- Android 体系架构
- Robot Framework自动化测试(五)--- 开发系统关键字
- OSGI学习札记
- 每日AC--leetCode--PalindromePartitioning--回溯法 递归实现
- C调用python
- ServletContext与Web应用以及Spring容器启动
- 2018校招web前端开发方向总结
- 题目456-邮票分你一半
- [UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()
- Oracle数据类型之number(转)
- 如何判断是否是微信端登录
- 基本操作详解