首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【日常刷题/动态规划C++]单词拆分,回文子串,分割回文串2

【日常刷题/动态规划C++]单词拆分,回文子串,分割回文串2

作者头像
用户11719958
发布2025-12-30 14:27:28
发布2025-12-30 14:27:28
820
举报

1,单词拆分

1.1,题目解析

判断一个字符串s,是否由给定的字典中的单词拼接而成。

1.2,思路

利用动态规划解题

最后,返回值,返回dp表最后一个值,表示以字符串最后一个字符结尾,是否可以拼接成功。 

1.3,代码
代码语言:javascript
复制
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> hash;
        for(auto& str:wordDict)
        {
            hash.insert(str);
        }

        int n=s.size();
        vector<bool> dp(n+1);
        s=" "+s;
        dp[0]=true;

        for(int i=1;i<=n;i++)
        {
            for(int j=i;j>=1;j--)
            {
                if(dp[j-1]==true&&hash.count(s.substr(j,i-j+1)))
                {
                    dp[i]=true;
                    break;
                }
            }
        }

        return dp[n];
    }
};

2,回文子串

2.1,题目解析

找到字符串s的回文子串的个数,单个字符也算一个回文字串。

2.2,思路
2.3,代码 
代码语言:javascript
复制
class Solution {
public:
    int countSubstrings(string s) {
       int n=s.size();
       vector<vector<bool>> dp(n,vector<bool>(n));
       int sum=0;

       for(int i=n-1;i>=0;i--)
       {
        for(int j=i;j<n;j++)
        { 
            if(s[i]==s[j])
            dp[i][j]=i+1<j?dp[i+1][j-1]:true;
            if(dp[i][j])
            sum++;
        }
       }
       return sum;
    }
};

3,分割回文串2

3.1,题目解析

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

3.2,思路
3,代码 
代码语言:javascript
复制
class Solution {
public:
    int minCut(string s) {
        int n=s.size();
        //[i,j]区间是否为回文串
        vector<vector<bool>> dp(n,vector<bool>(n));
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j])
                dp[i][j]=i+1<j?dp[i+1][j-1]:true;
            }
        }

        //[0,i]区间的最少分割次数
        vector<long long> dp2(n,INT_MAX);
        for(int i=0;i<n;i++)
        {
           if(dp[0][i])
           dp2[i]=0;
           else
           {
            for(int j=1;j<=i;j++)
            {
                if(dp[j][i])
                dp2[i]=min(dp2[j-1]+1,dp2[i]);
            }
           }
        }

        return dp2[n-1];

        
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1,单词拆分
    • 1.1,题目解析
    • 1.2,思路
    • 1.3,代码
  • 2,回文子串
    • 2.1,题目解析
    • 2.2,思路
    • 2.3,代码 
  • 3,分割回文串2
    • 3.1,题目解析
    • 3.2,思路
    • 3,代码 
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档