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

回文分区

阎英朗
2023-03-14
本文向大家介绍回文分区,包括了回文分区的使用技巧和注意事项,需要的朋友参考一下

在此算法中,输入是一个字符串,当分区的每个子字符串都是回文时,该字符串的分区就是回文分区。

在这种算法中,我们必须找到回文分割给定字符串所需的最小割数。

输入输出

Input:
A string. Say “ababbbabbababa”
Output:
Minimum cut to partition as palindrome. Here 3 cuts are needed.
The palindromes are: a | babbbab | b | ababa

算法

minPalPart(str)

输入:给定的字符串。

输出:字符串中回文分区的最小数量。

Begin
   n := length of str
   define cut matrix and pal matrix each of order n x n

   for i := 0 to n, do
      pal[i, i] := true
      cut[i, i] := 0
   done

   for len in range 2 to n, do
      for i in range 0 to n – len, do
         j := i + len – 1
         if len = 2, then
            if str[i] = str[j]
               pal[i, j] := true
         else
            if str[i] = str[j] and pal[i+1, j-1] ≠ 0
               pal[i, j] := true

         if pal[i, j] is true, then
            cut[i, j] := 0
         else

            cut[i, j] := ∞
            for k in range i to j-1, do
               cut[i, j] := minimum of cut[i, j] and (cut[i, k]+ cut[k+1, j+1]+1)
            done
      done
   done
   return cut[0, n-1]
End

示例

#include <iostream>
using namespace std;

int min (int a, int b) {
   return (a < b)? a : b;
}

int minPalPartion(string str) {
   int n = str.size();

   int cut[n][n];
   bool pal[n][n];              //true when palindrome present for i to jth  element

   for (int i=0; i<n; i++) {
      pal[i][i] = true;         //substring of length 1 is plaindrome
      cut[i][i] = 0;
   }

   for (int len=2; len<=n; len++) {
      for (int i=0; i<n-len+1; i++) {        //find all substrings of length len

         int j = i+len-1;              // Set ending index
         if (len == 2)                 //for two character string
            pal[i][j] = (str[i] == str[j]);
         else                  //for string of more than two characters
            pal[i][j] = (str[i] == str[j]) && pal[i+1][j-1];

         if (pal[i][j] == true)
            cut[i][j] = 0;
         else {
            cut[i][j] = INT_MAX;          //initially set as infinity
            for (int k=i; k<=j-1; k++)
               cut[i][j] = min(cut[i][j], cut[i][k] + cut[k+1][j]+1);
         }
      }
   }
   return cut[0][n-1];
}

int main() {
   string str= "ababbbabbababa";
   cout << "Min cuts for Palindrome Partitioning is:" << minPalPartion(str);
}

输出结果

Min cuts for Palindrome Partitioning is: 3
 类似资料:
  • 本文向大家介绍C ++中的回文分割III,包括了C ++中的回文分割III的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个包含小写字母和整数k的字符串s。我们必须维护一些属性。这些是- 首先,我们必须将s的某些字符(如果需要)更改为其他小写英文字母。 然后将字符串s分为k个子字符串,以使每个子字符串都是回文。 我们必须找到为分割字符串而需要更改的最少字符数。 因此,如果字符串像“ abab

  • 当输入像“os so”这样的字符串时,输出不正确,因为该字符串没有作为回文报告。这个问题似乎与空格有关,因为如果相同的字符串中没有空格,它将正确地作为回文报告。我真的有兴趣了解这个代码的缺陷,任何帮助都将非常感谢!

  • 问题内容: 我在SO中找不到类似的东西。 在ASP.NET中,有什么提示可以导致我在UpdatePanel中使用Javascript进行部分回发吗? 我试过了,但它做了完整的回发。 我可以用一个虚拟按钮欺骗它,然后开火然后以这种方式处理部分回发,但是我想要一种比欺骗更优雅的方法。 谢谢。 编辑:我发现此不为所动buddha.wordpress.com/2007/11/26/…但是我无法使它工作=(

  • 主要内容:分离事件类型的回调,分离所有回调本章将向学习如何分离Firebase中的回调。 分离事件类型的回调 下面将分离一个具有值事件类型的函数的回调。 示例 可使用方法,这将删除所有值事件类型的回调。 分离所有回调 当想要分离所有的回调,我们可以使用 -

  •   spark.mllib提供了多种方法用于用于二分类、多分类以及回归分析。 下表介绍了每种问题类型支持的算法。 问题类型 支持的方法 二分类 线性SVMs、逻辑回归、决策树、随机森林、梯度增强树、朴素贝叶斯 多分类 逻辑回归、决策树、随机森林、朴素贝叶斯 回归 线性最小二乘、决策树、随机森林、梯度增强树、保序回归   点击链接,了解具体的算法实现。 分类和回归 线性模型 SVMs(支持向量机)

  • 我正在尝试用抓取和分页来制作应用程序,在一个页面上应该有12个元素,到目前为止,我已经实现了一些东西,有12个元素,我可以看到下一页和上一页,但我希望能够看到页面的数量,然后能够例如从第一页跳到第三页等,有人知道怎么做吗?我的代码: 编辑:我尝试使用react js分页,但除了这一点,我可以看到下面的页面数,当我更改页面时,什么都不会发生,我的意思是我知道如何编写一个函数来查看接下来的12页或之前

  • 1 保序回归   保序回归解决了下面的问题:给定包含n个数据点的序列 y_1,y_2,...,y_n , 怎样通过一个单调的序列 beta_1,beta_2,...,beta_n 来归纳这个问题。形式上,这个问题就是为了找到   大部分时候,我们会在括号前加上权重w_i。解决这个问题的一个方法就是 pool adjacent violators algorithm(PAVA) 算法。粗略的讲,PA

  • 1 基本概念 1.1 生存数据   生存数据就是关于某个体生存时间的数据。生存时间就是死亡时间减去出生时间。例如,以一个自然人的出生为“出生”,死亡为“死亡”。 那么,死亡时间减去出生时间,就是一个人的寿命,这是一个典型的生存数据。类似的例子,还可以举出很多。所有这些数据都有一个共同的特点, 就是需要清晰定义的:出生和死亡 。如果用死亡时间减去出生时间,就产生了一个生存数据。因为死亡一定发生在出生