求2个字符串的最长公共子串长度

来源:互联网 发布:卸载windows更新补丁 编辑:程序博客网 时间:2024/05/16 16:58

题目:

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出一个整数,代表最少需要删除的字符个数。

输入例子:
abcdagoogle

输出例子:
22

实现的思路,回文就是正序和倒序都一样,所以可以看做是求字符串的正序和倒序的最长公共子串LCS,然后用原始长度减去最长公共字串的长度即为所求。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. #include<string>  
  3.   
  4. using namespace std;  
  5.   
  6. int findMax(int &a, int &b)  
  7. {  
  8.     return (a > b) ? a : b;  
  9. }  
  10.   
  11. int getLCS(string &s1, string &s2)//动态规划法  
  12. {  
  13.     int i, j;  
  14.     int m = s1.length();  
  15.     int n = s2.length();  
  16.   
  17.     int **c = new int*[m+1];  
  18.     for (i = 0; i < m+1 ; i++)  
  19.         c[i] = new int[n+1 ];//申请一个m x n的备忘表  
  20.   
  21.     for (i = 0; i < m + 1; i++)  
  22.         c[i][0] = 0;//添加一行为0的  
  23.     for (j = 0; j < n + 1; j++)  
  24.         c[0][j] = 0;//添加一列为0的  
  25.   
  26.     int max = -1;  
  27.   
  28.     for ( i = 1; i < m+1; i++)  
  29.     {  
  30.         for ( j = 1; j < n+1; j++)  
  31.         {  
  32.             if (s1[i - 1] == s2[j - 1])  
  33.                 c[i][j] = c[i - 1][j - 1] + 1; //左上方+1  
  34.             else  
  35.             {  
  36.                 c[i][j] = findMax(c[i - 1][j], c[i][j - 1]);  
  37.             }  
  38.         }  
  39.     }  
  40.   
  41.   
  42.     return c[m][n];  
  43. }  
  44.   
  45. int main()  
  46. {  
  47.     string s1;  
  48.   
  49.     while (cin >> s1)  
  50.     {  
  51.         string s2 = s1;  
  52.           
  53.         for (int i = 0; i < s1.length(); i++)//倒置,在vs环境下,可用reverse(s1.begin(),s1.end());来代替  
  54.         {  
  55.             s2[i] = s1[s1.length() - i - 1];  
  56.         }  
  57.   
  58.         int len_LCS = getLCS(s1, s2);  
  59.   
  60.         int cnt = s1.length() - len_LCS;  
  61.         cout << cnt << endl;  
  62.   
  63.     }  
  64.   
  65.   
  66.     return 0;  
  67.       
  68.   
  69.   
  70. }  
0 0