生活随笔
收集整理的這篇文章主要介紹了
131. Palindrome Partitioning
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
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的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。