1. 程式人生 > >LintCode- 分割回文串

LintCode- 分割回文串

分割回文串

給定一個字串s,將s分割成一些子串,使每個子串都是迴文串。

返回s所有可能的迴文串分割方案。

樣例

給出 s = “aab”,返回

[
[“aa”, “b”],
[“a”, “a”, “b”]
]

//這裡運用了回溯演算法 遞推呼叫 動態規劃的演算法思想
public class Solution {
    /**
     * @param s: A string
     * @return: A list of lists of string
     */
    public List<List<String>> partition
(String s) { List<List<String>> result = new ArrayList<List<String>>(); List<String> re = new ArrayList<String>(); this.find(s, re, 0, result); return result; } //用來遍歷 //思路為從s[0]位置開始向後尋找可分割的位置,尋找函式為isRight(用來檢測傳入的字串是否為迴文) //例如:{[a],b,a,c} 遍歷到第一個位置時 出現迴文 則遞迴呼叫find函式 並且把標記位置star指向第二個位置
//遞迴進入的函式如圖:{a,[b],a,c} //下面說下第二層迴圈(即j==1時的情況) 此時isRight函式檢測的字串為{[a,b],a,c} 不是迴文 所以j++ //進入第三層迴圈(即j==2時的情況) 此時isRight函式檢測的字串為{[a,b,a],c}是迴文 遞迴呼叫。 public void find(String s, List<String> result, int star, List<List<String>> re) { int len = s.length(); if (star == len) { re.add(result); return
; } for (int j = star; j < len; j++) { if (isRight(s.substring(star, j + 1))) { List<String> add = new ArrayList<String>(); add.addAll(result); add.add(s.substring(star, j + 1)); this.find(s, add, j + 1, re); } } } //檢測輸入字串是否為迴文 public boolean isRight(String s) { int len = s.length(); for (int i = 0; i < len / 2; i++) { if (s.charAt(i) != s.charAt(len - i - 1)) { return false; } } return true; } }