<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)131:分割回文串

          共 3162字,需瀏覽 7分鐘

           ·

          2020-12-21 15:09

          算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問(wèn)題叫做?分割回文串,我們先來(lái)看題面:
          https://leetcode-cn.com/problems/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.


          A palindrome string is a string that reads the same backward as forward.

          題意

          給定一個(gè)字符串 s,將 s 分割成一些子串,使每個(gè)子串都是回文串。
          返回 s 所有可能的分割方案。


          樣例

          示例:

          輸入: "aab"
          輸出:
          [
          ??["aa","b"
          ],
          ??["a","a","b"]
          ]


          解題

          https://www.jianshu.com/p/e1017e1674ea

          這是一道很綜合的題目,結(jié)合了動(dòng)態(tài)規(guī)劃,深度搜索和回溯法。

          首先為了分割出回文串,我們首先要寫(xiě)出判斷回文串的方法,這里使用動(dòng)態(tài)規(guī)劃來(lái)判斷回文串,而且可以存儲(chǔ)子串的回文串的情況。
          isPalindrome[i][j]:表示i到j(luò)的子串是否是回文串。

          狀態(tài)轉(zhuǎn)移方程:

          isPalindrome[i][j] = isPalindrome[i+1][j-1] && s.charAt(i) == s.charAt(j)
          自然如果一個(gè)串是回文串,那么首尾必須要相等,并且中間也是子串。
          初始化,顯然當(dāng)i==j的時(shí)候都是回文串
          當(dāng)串只有兩個(gè)字符且相等的時(shí)候也是回文串。

          知道如何判斷子串是否是回文串就好辦了,然后只要模式化的深度搜索回溯即可 。

          public?class?Solution?{
          ????/**
          ?????* @param s: A string
          ?????* @return: A list of lists of string
          ?????*/

          ????
          ????List> results;
          ????boolean[][] isPalindrome;
          ????
          ????/**
          ?????* @param s: A string
          ?????* @return: A list of lists of string
          ?????*/

          ????public?List> partition(String s) {
          ????????results = new?ArrayList<>();
          ????????if?(s == null?|| s.length() == 0) {
          ????????????return?results;
          ????????}
          ????????
          ????????getIsPalindrome(s);
          ????????
          ????????helper(s, 0, new?ArrayList());
          ????????
          ????????return?results;
          ????}
          ????
          ????private?void?getIsPalindrome(String s) {
          ????????int?n = s.length();
          ????????isPalindrome = new?boolean[n][n];
          ????????
          ????????for?(int?i = 0; i < n; i++) {
          ????????????isPalindrome[i][i] = true;
          ????????}
          ????????for?(int?i = 0; i < n - 1; i++) {
          ????????????isPalindrome[i][i + 1] = (s.charAt(i) == s.charAt(i + 1));
          ????????}
          ????????
          ????????for?(int?i = n - 3; i >= 0; i--) {
          ????????????for?(int?j = i + 2; j < n; j++) {
          ????????????????isPalindrome[i][j] = isPalindrome[i + 1][j - 1] && s.charAt(i) == s.charAt(j);
          ????????????}
          ????????}
          ????}
          ????
          ????private?void?helper(String s,
          ????????????????????????int?startIndex,
          ????????????????????????List partition
          )
          {
          ????????if?(startIndex == s.length()) {
          ????????????addResult(s, partition);
          ????????????return;
          ????????}
          ????????
          ????????for?(int?i = startIndex; i < s.length(); i++) {
          ????????????if?(!isPalindrome[startIndex][i]) {
          ????????????????continue;
          ????????????}
          ????????????partition.add(i);
          ????????????helper(s, i + 1, partition);
          ????????????partition.remove(partition.size() - 1);
          ????????}
          ????}
          ????
          ????private?void?addResult(String s, List partition) {
          ????????List result = new?ArrayList<>();
          ????????int?startIndex = 0;
          ????????for?(int?i = 0; i < partition.size(); i++) {
          ????????????result.add(s.substring(startIndex, partition.get(i) + 1));
          ????????????startIndex = partition.get(i) + 1;
          ????????}
          ????????results.add(result);
          ????}
          }

          好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力。

          上期推文:

          LeetCode1-120題匯總,希望對(duì)你有點(diǎn)幫助!
          LeetCode刷題實(shí)戰(zhàn)121:買(mǎi)賣(mài)股票的最佳時(shí)機(jī)
          LeetCode刷題實(shí)戰(zhàn)122:買(mǎi)賣(mài)股票的最佳時(shí)機(jī) II
          LeetCode刷題實(shí)戰(zhàn)123:買(mǎi)賣(mài)股票的最佳時(shí)機(jī) III
          LeetCode刷題實(shí)戰(zhàn)124:二叉樹(shù)中的最大路徑和
          LeetCode刷題實(shí)戰(zhàn)125:驗(yàn)證回文串
          LeetCode刷題實(shí)戰(zhàn)126:?jiǎn)卧~接龍 II
          LeetCode刷題實(shí)戰(zhàn)127:?jiǎn)卧~接龍
          LeetCode刷題實(shí)戰(zhàn)128:最長(zhǎng)連續(xù)序列
          LeetCode刷題實(shí)戰(zhàn)129:求根到葉子節(jié)點(diǎn)數(shù)字之和
          LeetCode刷題實(shí)戰(zhàn)130:被圍繞的區(qū)域


          瀏覽 31
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产这里只有精品 | 乱熟女高潮一区二区在线观看 | 韩国一区二区在线播放 | 韩国色五月婷婷 | 免费无码成人片在线观看在线 |