POJ 1159 字符串匹配问题

题目大意:

问至少添加几个字符才能保证这个字符串是个回文串

一开始想也想不到字符串匹配上,因为是找回文串,我们可以把已给字符串逆向得到一个新的字符串,然后比较两者得到最大匹配长度,最后总长度减去最大匹配长度

就是所要求的值

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 #define N 5005
 7 char str[N],rev[N];
 8 short dp[N][N];
 9 void get_rev(int n,char *str)
10 {
11     int cnt=0;
12     for(int i=n-1;i>=0;i--)
13         rev[cnt++]=str[i];
14 }
15 int main()
16 {
17     int n;
18     scanf("%d",&n);
19     scanf("%s",str);
20     get_rev(n,str);
21     //cout<<str<<endl<<rev<<endl;
22     memset(dp,0,sizeof(dp));
23
24     for(int i=1;i<=n;i++){
25         //dp[i][j]=max(dp[i-1][j],dp[i+1][j]);
26         for(int j=1;j<=n;j++){
27             if(str[i-1]==rev[j-1]) dp[i][j]=dp[i-1][j-1]+1;
28             else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
29         }
30     }
31
32     printf("%d\n",n-dp[n][n]);
33     return 0;
34 }

POJ 1159 字符串匹配问题

时间: 2024-10-12 04:17:53

POJ 1159 字符串匹配问题的相关文章

poj 1035 字符串匹配

//刚开始傻乎乎的拿字典树写,佛了,就一水题 #include<iostream> #include<cstdio> #include<string> #include<algorithm> #include<cmath> using namespace std; const int maxn = 1e4 + 15; string strArr[maxn]; int cnt = 0; int main() { while(1) { cin>

poj 1159 Palindrome (LCS)

链接:poj 1159 题意:给定一个字符串,求最少添加多少个字符可使得该字符串变为回文字符串 分析:设原序列S的逆序列为S' ,最少需要补充的字母数 = 原序列S的长度 - S和S'的最长公共子串长度 原因:要求最少添加几个字符,我们可以先从原串中找到一个最长回文串,然后对于原串中不属于这个回文串的字符,在它关于回文串中心的对称位置添加一个相同字符即可.那么需要添加的字符数量即为n-最长回文串长度. 最长回文串可以看作是原串中前面和后面字符的一种匹配(每个后面的字符在前面找到一个符合位置要求的

POJ 1159 Palindrome(lcs加滚动数组)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 52350   Accepted: 18041 Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a

【POJ 1159】Palindrome

[POJ 1159]Palindrome 最近各种题各种奇葩思路已经司空见惯了...又新出个滚动数组= = 该题还有一点需要知道 最少需要补充的字母数 = 原序列S的长度 - S和S'的最长公共子串长度 然而窝原本并不知道--然后写出了一个奇葩dp做法 居然比LCS快0.0 我的思路是从左往右遍历 每个字符从右往左遍历到他的后一位置 dp数组标记当前位置往右对应匹配字符串左半边的最长序列长度的两倍(即为要删除序列长度) 每找到一个str[i]==str[j] 更新dp[j]为此时最长序列+2(左

uva:10340 - All in All(字符串匹配)

题目:10340 - All in All 题目大意:给出字符串s和t,问s是否是t的子串.s若去掉某些字符能和t一样,那么t是s的子串. 解题思路:匹配字符.t的每个字符和s中的字符匹配.注意这里的字符数组大小要开大点. 代码: #include <stdio.h> #include <string.h> const int N = 1000005; char s[N], t[N]; bool match () { int i = 0; int lens = strlen(s);

CCF 字符串匹配

问题描述 试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时,表示同一个字母的大写和小写看作相同的字符. 输入格式 输入的第一行包含一个字符串S,由大小写英文字母组成. 第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小

字符串匹配的KMP算法

html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; color: ; background-color: ; margin: 0; padding: 16px 20px; } h1, h2, h

字符串匹配与KMP算法笔记

>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个一个进行比较, 如果不成功则模式串向右移动一个单位,直到匹配成功或者到达匹配串最后仍然不成功,返回失败. 很明显,这种算法有很多的地方可以优化,假设要搜索的串为S,长度为n,要匹配的串为M,长度为m,时间复杂度为O(nm). >>KMP算法 Knuth-Morris-Pratt算法以三个发明者命名

KMP算法解决字符串匹配

该算法由D.E.Knuth ,J.H.Morris和 V.R.Pratt提出,用于解决字符串匹配问题. 思想: 设目标串(主串)为s,模式串为t ,并设i指针和j指针分别指示目标串和模式串中正待比较的字符,设i和j的初值均为0.若有s[i]=t[j],则i和j分别加1.否则,i不变,j退回到j=next[j-1]的位置,再比较s[i]和t[j],若相等,则i和j分别加1.否则,i不变,j再次退回到j=next[j]的位置,依此类推.直到下列两种可能: 1. 模式串t中的字符全部匹配,则出现频率+