自学内容网 自学内容网

分割回文串(DFS)

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

DFS:

class Solution {
    vector<string> path;
    vector<vector<string>> v;
public:
    vector<vector<string>> partition(string s) {
        dfs(s, 0);
        return v;
    }

    void dfs(string s, int i){  //i 是一个索引,表示当前递归调用时正在考虑的子串的起始位置
        if (i == s.size()) { //当 i 达到字符串 s 的末尾时,说明找到了一个完整的回文分割方案
            v.push_back(path);
            return;
        }
        
        for(int j = i; j < s.size(); j++){
            if(is(s, i, j)){   // 如果 s[i:j] 是回文
                path.push_back(s.substr(i, j - i + 1));  // 加入当前子串到 path
                dfs(s, j + 1);   // 递归调用,从下一个索引开始继续分割
                path.pop_back();  // 回溯,撤销前面的选择
            }
        }


    }

    bool is(string& s, int left, int right){ //检查字符串 s 的 [left, right] 区间是否是回文。
          while(left < right){
            if(s[left++] != s[right--]){
                return false;
            }
        }
       return true;
    }
};

vector<string> path:用于存储当前分割方案中的回文子串

vector<vector<string>> v:存储所有符合条件的回文分割方案

dfs 函数在每次递归时,从位置 i 开始,检查从 ij 的每个子串是否是回文。一旦找到一个回文子串,就递归到下一个位置(即从 j + 1 开始),继续对剩余的字符串进行分割,直到整个字符串都被分割成回文子串为止。

path.push_back(s.substr(i, j - i + 1));

这一行代码的作用是将字符串 s 的一个子串添加到 path 中。

substr(i, len):用于提取从 i 开始,长度为 len 的子串。

  • i:子串的起始位置(从 0 开始)。
  • len:子串的长度。

原文地址:https://blog.csdn.net/Ct314/article/details/143633740

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!