日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

131. Palindrome Partitioning

發布時間:2023/12/10 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 131. Palindrome Partitioning 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1 題目理解
  • 2 回溯
  • 3 動態規劃

1 題目理解

輸入:字符串s
規則:將字符串s分割,分割后每一個部分都是一個回文串。
輸出:所有的分割方式

Example 1:

Input: s = “aab”
Output: [[“a”,“a”,“b”],[“aa”,“b”]]
Example 2:

Input: s = “a”
Output: [[“a”]]

2 回溯

例如s=‘aab’
處理第0個字符a:a是回文嗎?是繼續處理(第1個字符)
????????????????????????aa是回文嗎?是,繼續處理(第2個字符)
????????????????????????aab是回文嗎?不是,跳過

處理第1個字符a:a是回文嗎?是繼續處理(第2個字符)
????????????????????????ab是回文嗎?不是

一直到最后

class Solution {private List<List<String>> answer;private String s;public List<List<String>> partition(String s) {answer = new ArrayList<List<String>>();this.s = s;dfs(0,new ArrayList<String>());return answer;}private void dfs(int index,List<String> list){if(index>= s.length()){answer.add(new ArrayList<String>(list));return;}for(int i=index+1;i<=s.length();i++){String str = s.substring(index,i);if(isPalindrome(str)){list.add(str);dfs(i,list);list.remove(list.size()-1);}}}private boolean isPalindrome(String s){int i = 0,j = s.length()-1;while(i<j){if(s.charAt(i)!=s.charAt(j)) return false;i++;j--;}return true;} }

時間復雜度O(n?n!)O(n*n!)O(n?n!),第一個字符有n種可能,第二個字符有n-1種可能,第三個字符n-2種可能,所以是n!。每次判斷是否是回文,時間復雜度O(n)。所以總體時間復雜度O(n?n!)O(n*n!)O(n?n!)

3 動態規劃

判斷是否是回文,可以進一步優化,使用動態規劃。這道題目第一次做是2020年5月。還記得當時看到解題答案驚呼原來動態規劃初始化還能這么玩!
邏輯是這樣的 s=“aab”。
boolean[][] dp,dp[i][j]=true表示下標從i到j的字符串是回文。
對于每個單個字符肯定是回文。所以所有的dp[i][i]=true。
接著處理相鄰的,如果s.char(i)=s.charAt(i+1),那么dp[i][i+1]=true。
長度為1,為2的已經處理了。
在這些字符串的基礎上左右擴展,如果左右擴展的字符相同,則說明是回文。

class Solution {private List<List<String>> answer;private String s;private boolean[][] dp;public List<List<String>> partition(String s) {answer = new ArrayList<List<String>>();this.s = s;int n = s.length();dp = new boolean[n][n];for(int i=0;i<n;i++){dp[i][i] = true;}for(int i=0;i<n-1;i++){if(s.charAt(i)==s.charAt(i+1)){dp[i][i+1]=true;}}for(int len = 3;len<=n;len++){for(int i=0;i<=n-len;i++){int j = len + i - 1;if(s.charAt(i) == s.charAt(j) && dp[i+1][j-1]){dp[i][j] = true;}}}dfs(0,new ArrayList<String>());return answer;}private void dfs(int index,List<String> list){if(index>= s.length()){answer.add(new ArrayList<String>(list));return;}for(int i=index+1;i<=s.length();i++){String str = s.substring(index,i);if(dp[index][i-1]){list.add(str);dfs(i,list);list.remove(list.size()-1);}}}}

總結

以上是生活随笔為你收集整理的131. Palindrome Partitioning的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。