• 【LeetCode-回溯】分割回文串


    题目描述

    给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

    返回 s 所有可能的分割方案。
    示例:

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

    题目链接: https://leetcode-cn.com/problems/palindrome-partitioning/

    思路

    由于是求所有可能分割情况,所以使用回溯来做。代码如下:

    class Solution {
    public:
        vector<vector<string>> partition(string s) {
            if(s.empty()) return {};
    
            vector<vector<string>> ans;
            vector<string> cur;
            int start = 0;
            dfs(s, start, cur, ans);
            return ans;
        }
    
        void dfs(string s, int start, vector<string> cur, vector<vector<string>>& ans){
            if(start>=s.size()){
                ans.push_back(cur);
                return;
            }
    
            for(int i=start; i<s.size(); i++){
                string sub = s.substr(start, i-start+1);
                if(judge(sub)){
                    cur.push_back(sub);
                    dfs(s, i+1, cur, ans);
                    cur.pop_back();
                }
            }
        }
    
        /*判断s是否是回文串,是返回true,不是返回false*/
        bool judge(string s){
            if(s.size()==1) return true;
            int left = 0;
            int right = s.size()-1;
            while(left<right){
                if(s[left]!=s[right]) return false;
                left++;
                right--;
            }
            return true;
        }
    };
    

    使用下面的写法(多加了几个引用&)可以将速度提升 4 倍:

    class Solution {
    public:
        vector<vector<string>> partition(string s) {
            if(s.empty()) return {};
    
            vector<string> cur;
            vector<vector<string>> ans;
            int start = 0;
            dfs(s, start, cur, ans);
            return ans;
        }
    
        void dfs(string& s, int start, vector<string>& cur, vector<vector<string>>& ans){
            if(start>=s.size()){
                ans.push_back(cur);
                return;
            }
    
            for(int i=start; i<s.size(); i++){
                string sub = s.substr(start, i-start+1);
                if(judge(sub)){
                    cur.push_back(sub);
                    dfs(s, i+1, cur, ans);
                    cur.pop_back();
                }
            }
        }
    
        /*判断s是否是回文串,是返回true,不是返回false*/
        bool judge(string& s){
            if(s.size()==1) return true;
            int left = 0;
            int right = s.size()-1;
            while(left<right){
                if(s[left]!=s[right]) return false;
                left++;
                right--;
            }
            return true;
        }
    };
    
  • 相关阅读:
    Android_bug之 task ':app:mergeDebugResources'. > Some file crunching failed, see logs f
    linux下vi命令大全[转]
    百度地图api 常用demo
    Mac之vim普通命令使用[转]
    java写文件
    java读取文件
    Android中对Log日志文件的分析[转]
    Android实用代码模块集锦
    java 位运算
    MyEclipse自带maven找不到或自己外置安装
  • 原文地址:https://www.cnblogs.com/flix/p/13285615.html
Copyright © 2020-2023  润新知