Leetcode——回溯法 palindrome-partitioning

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

知識點:
字符串,leetcode
解題思路:
【個人思路】
首先要理解題意,給一個字符串s,返回s中爲迴文字符串的所有子字符串。使用回溯法來解決問題,有時候會遇到一類問題,又不能得出明確的動態規劃或是遞歸解法此時用回溯法解決此類問題。
回溯法:
算法
回溯法.

  • 從字符串開頭掃描, 找到一個下標i, 使得 str[0…i]是一個迴文字符串 將str[0…i]記入臨時結果中

  • 然後對於剩下的字符串str[i+1, end]遞歸調用前面的兩個步驟, 直到i+1 >= end結束 這時候, 我們找到了一組結果.

  • 開始回溯. 以回溯到最開始的位置i爲例. 從i開始, 向右掃描, 找到第一個位置j, 滿足str[0…j]爲一個迴文字符串

  • 然後重複前面的四個步驟.

以字符串 “ababc” 爲例.

  • 首先找到 i = 0, "a"爲迴文字符串.
  • 然後在子串"babc"中繼續查找, 找到下一個 “b”, 遞歸找到 “a”, “b”, “c”. 至此我們找到了第一組結果. [“a”,
    “b”, “a”, “b”, “c”]
  • 將c從結果中移除, 位置回溯到下標爲3的"b". 從"b"開始向後是否存在str[3…x]爲迴文字符串, 發現並沒有.
  • 回溯到下標爲2的"a", 查找是否存在str[2…x]爲迴文字符串, 發現也沒有. 繼續回溯到下標爲1的"b",
    查找是否存在str[1…x]爲迴文字符串, 找到了"bab", 記入到結果中. 然後從下標爲4開始繼續掃描.
    找到了下一個迴文字符串"c".
  • 我們找到了下一組結果 [“a”, “bab”, “c”] 然後繼續回溯 + 遞歸.
    (以上的思路和例子參考作者:周肅
    鏈接:https://www.jianshu.com/p/7e60788b4d2f)
    具體代碼:
package test;

import java.net.Inet4Address;
import java.nio.channels.NonWritableChannelException;
import java.util.ArrayList;
import java.util.Scanner;

import javax.swing.text.AbstractDocument.LeafElement;
import javax.xml.bind.SchemaOutputResolver;

public class palindrome_partitioning {

  public static ArrayList<ArrayList<String>> partition(String s){
  	ArrayList<ArrayList<String>> res=new ArrayList<ArrayList<String>>();
  	if(s==null || s.length()==0)
  		return res;
  	
  	solve(s,0,new ArrayList<String>(),res);
  	return res;
  	
  			
  }
  
  private static void solve(String s, int index, ArrayList<String> preList, ArrayList<ArrayList<String>> res) {
  	// TODO Auto-generated method stub
  	if(index==s.length()){
  		res.add(new ArrayList<String>(preList));
  		return;
  	}
  	ArrayList<String> list=new ArrayList<String>(preList);
  	for(int i=index+1;i<=s.length();i++){
  		if(isPalindrom(s.substring(index, i))){
  			list.add(s.substring(index,i));
  			solve(s, i, list, res);
  			list.remove(list.size()-1);
  		}
  	}
  }

  private static boolean isPalindrom(String substring) {
  	// TODO Auto-generated method stub
  	if(substring==null) return false;
  	 int l=0,r=substring.length()-1;
  	 while(l<r){
  		 if(substring.charAt(l++) != substring.charAt(r--))
  			 return false;
  	 }
  	return true;
  }

  public static void main(String[] args){
  	Scanner sc=new Scanner(System.in);
  	ArrayList<ArrayList<String>> res=new ArrayList<ArrayList<String>>();
  	String s=sc.nextLine();
  	res=partition(s);
  	for(int k=0;k<res.size();k++){
  		System.out.print(res.get(k));
  	}
  }
}

注意點
感覺這類題好難呀,還是需要多加練習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章