当前位置: 首页 > 编程笔记 >

C ++中的回文分割III

董良策
2023-03-14
本文向大家介绍C ++中的回文分割III,包括了C ++中的回文分割III的使用技巧和注意事项,需要的朋友参考一下

假设我们有一个包含小写字母和整数k的字符串s。我们必须维护一些属性。这些是-

  • 首先,我们必须将s的某些字符(如果需要)更改为其他小写英文字母。

  • 然后将字符串s分为k个子字符串,以使每个子字符串都是回文。

我们必须找到为分割字符串而需要更改的最少字符数。

因此,如果字符串像“ ababbc”并且k = 2,则答案将是1,因为我们必须更改一个字符以将其分成两个回文字符串。因此,如果将c更改为b,或将倒数第二个b更改为c,则可以得到一个回文,如“ bbb”或“ cbc”,而另一个回文为“ aba”。

为了解决这个问题,我们将遵循以下步骤-

  • 定义大小为105 x 105的数组备忘。

  • 定义一个函数solve(),它将使用s,idx,k,一个2D数组> dp,

  • 如果idx与s的大小相同,则-

    • 当k为0时返回,否则为0,否则返回1000

  • 如果memo [idx] [k]不等于-1,则-

    • 返回备忘录[idx] [k]

  • 如果k <= 0,则-

    • 返回信息

  • ans:= inf

  • 对于初始化i:= idx,当i <s的大小时,更新(将i增加1),执行-

    • ans:= ans和dp [idx] [i]的最小值+调用函数solve(s,i + 1,k-1,dp)

  • 返回memo [idx] [k] = ans

  • 在主要方法中,执行以下操作

  • n:= s的大小

  • 用-1填充备忘录

  • 定义一个大小为nxn的2D数组dp

  • 对于初始化l:= 2,当l <= n时,更新(将l增加1),-

    • 如果l与2相同,则-

    • dp [i] [j]:=当s [i]与s [j]不同时为true

    • 除此以外

    • dp [i] [j]:= dp [i + 1] [j-1] + 0,如果s [i]与s [j]相同

    • 对于初始化i:= 0,j:= l-1,当j <n时,更新(j增加1),(i增加1),-

    • 返回solve(s,0,k,dp)

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       int memo[105][105];
       lli solve(string s, int idx, int k, vector < vector <int> > &dp){
          if(idx == s.size()) {
             return k == 0? 0 : 1000;
          }
          if(memo[idx][k] != -1) return memo[idx][k];
          if(k <= 0)return INT_MAX;
          lli ans = INT_MAX;
          for(int i = idx; i < s.size(); i++){
             ans = min(ans, dp[idx][i] + solve(s, i + 1, k - 1, dp));
          }
          return memo[idx][k] = ans;
       }
       int palindromePartition(string s, int k) {
          int n = s.size();
          memset(memo, -1, sizeof(memo));
          vector < vector <int> > dp(n, vector <int>(n));
          for(int l =2; l <= n; l++){
             for(int i = 0, j = l - 1; j <n; j++, i++){
                if(l==2){
                   dp[i][j] = !(s[i] == s[j]);
                }else{
                   dp[i][j] = dp[i+1][j-1] + !(s[i] == s[j]);
                }
             }
          }
          return solve(s, 0, k, dp);
       }
    };
    main(){
       Solution ob;
       cout << (ob.palindromePartition("ababbc", 2));
    }

    输入项

    “ababbc”

    输出结果

    1
     类似资料:
    • 本文向大家介绍C#文件分割的方法,包括了C#文件分割的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#文件分割的方法。分享给大家供大家参考。具体如下: 1. 小文件分割(适用于小于等于64M的文件): 2. 大文件分割(适用于大于64M的文件) 希望本文所述对大家的C#程序设计有所帮助。

    • 问题内容: 我正在创建一个应用程序,该应用程序应该使用get方法从mySql数据库读取文本。 一旦它以字符串的形式从数据库中获取数据元素,就应该拆分字符串并使用该字符串创建列表,但是split()方法似乎在这里不起作用。 J2ME说-我该怎么办? 我的代码如下: 我已经在台式机和控制台应用程序上进行了尝试,并且看起来运行良好,但是代码无法在j2me应用程序中运行。我应该使用一种方法吗?我能做什么?

    • 根据其他建议,取消引用可能会出现问题,但我在调用max_element函数时甚至在取消引用之前就出现了分段错误。 最小可复制示例:

    • 我正在处理这样的文本文件: 第01章 乱数假文 多洛·希特·阿梅特,一位杰出的献身者,他是一位临时顾问 第02章 献祭 临时行政长官 第03章 等等,多洛尔·马格纳·阿利夸。 带有分隔符,如“章”、“章”、“章”等...和1或2位数(“第1章”或“第01章”)。 我使用和 现在我需要拆分我的字符串,以便获得“第二十章”的文本。 对于第02章,这将是: 献祭 临时行政长官 我是Python新手,我读

    • 问题内容: 我正在尝试寻找一种方法来打破已自适应阈值的扫描文档中的文本行。现在,我将文档的像素值存储为0到255之间的无符号整数,并获取每行像素的平均值,然后根据像素值的平均值是否为0将行划分为多个范围大于250,然后将其取为各行范围的中值。但是,此方法有时会失败,因为图像上可能会出现黑色斑点。 有没有更好的抗噪方法来执行此任务? 编辑:这是一些代码。“扭曲”是原始图像的名称,“剪切”是我要分割图

    • 主要内容:分割PDF文档中的页面,示例在前一章中,我们已经看到了如何将JavaScript添加到PDF文档。 现在来学习如何将给定的PDF文档分成多个文档。 分割PDF文档中的页面 可以使用类将给定的PDF文档分割为多个PDF文档。 该类用于将给定的PDF文档分成几个其他文档。 以下是拆分现有PDF文档的步骤 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态方法,可