LeetCode Palindrome Partitioning

本文介绍了一种解决回文分割问题的算法实现,通过动态规划方法寻找字符串的所有可能分割方式,确保每部分都是回文串。文章提供了详细的Java代码示例,并展示了如何使用该算法处理特定输入。

https://oj.leetcode.com/problems/palindrome-partitioning/

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"]
  ]

Show Tags

















这是一个动态规划问题,list[i]表示从0到i的字符串中的所有分割方式,缺点是空间占用比较多。



import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Solution {
	
	

	List<List<String>> partition(String s){

    	int n = s.length();
    	
		boolean[][] PalindromePair = new boolean [n][n];
		
		ArrayList<String>  arrayList  = new ArrayList ();
		
    	List<List<String>>list[] = new LinkedList[n];
    	
    	for(int i=0;i<n;i++){
    		
    		PalindromePair[i][i] = true;

    	}
    	
    	arrayList.add(s.substring(0,1));
    	list[0]=new LinkedList<List<String>>();
    	list[0].add(arrayList);
    	
    	
    	for(int i=1; i<n; i++){
    		
    		list[i] = new LinkedList<List<String>>();
    		for(int j=0; j<=i; j++){
    			
    			if(s.charAt(j)==s.charAt(i)&&((i-j)<2||PalindromePair[j+1][i-1])){
    				
    				PalindromePair[j][i] = true;
    				
    				if(j==0){
    					
    					ArrayList<String>tempArrayList = new ArrayList<String>();
    					tempArrayList.add(s.substring(0,i+1));
    					list[i].add(tempArrayList);
    				}
    				else{
    					
    					for(int u=0; u< list[j-1].size();u++){
    						ArrayList<String>tempArrayList = new ArrayList<String>();
    						tempArrayList.addAll(list[j-1].get(u));
    						tempArrayList.add(s.substring(j,i+1));
    						list[i].add(tempArrayList);
    					}
    					
    				}
    				
    			}
    		}
    		
    	}
    	
		return list[n-1];
		
    }
    
    public static void main(String[]args){
    	
    	Solution solution = new Solution();
    	
    	String string = new String("efe");
    	
    	
    	List<List<String>> list = solution.partition(string);
    	
    	for (List<String> list2 : list) {
			System.out.println(list2);
		}
    	
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值