【Leetcode】【Medium】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",spa

Returncode

  [
    ["aa","b"],
    ["a","a","b"]
  ]

 

解題:blog

使用深刻優先搜索的思想;使用遞歸;遞歸

從頭i = 0開始遍歷字符串,找到知足要求的迴文列,將其放入結果列表中,繼續查找下面的迴文字符;字符串

 

解題步驟:string

一、主函數,創建返回的二維數組,創建存放結果的一維數組,調用遞歸函數;it

二、遞歸函數,輸入爲二維數組ret,一維數組path,字符串str,當前檢查到的index值:io

  (1)若是index值已經等於str的長度,說明搜索完畢,將path插入ret中,返回;

  (2)不然從i從index開始,遍歷到str末尾,找index~i範圍哪些是迴文串:

    a. 將回文串摘出放入path中,更新index,繼續遞歸;

    b. 從path中pop出放入的迴文串,繼續遍歷循環;

三、返回ret

 

代碼:

 1 class Solution {
 2 public:
 3     vector<vector<string>> partition(string s) {
 4         vector<vector<string> > ret;
 5         if(s.empty()) 
 6             return ret;
 7 
 8         vector<string> path;
 9         dfs(ret, path, s, 0);
10 
11         return ret;
12     }
13 
14     void dfs(vector<vector<string> >& ret, vector<string>& path, string& s, int index) {
15         if(index == s.size()) {
16             ret.push_back(path);
17             return;
18         }
19         
20         for(int i = index; i < s.size(); ++i) {
21             // find all palindromes begin with index
22             if(isPalindrome(s, index, i)) {
23                 path.push_back(s.substr(index, i - index + 1));
24                 dfs(ret, path, s, i+1);
25                 path.pop_back();
26             }
27         }
28     }
29 
30     bool isPalindrome(const string& s, int start, int end) {
31         while(start <= end) {
32             if(s[start++] != s[end--])
33                 return false;
34         }
35         return true;
36     }
37 };
相關文章
相關標籤/搜索