NOJ37 回文字符串---整理一下都是各种回文类型啊,
2013-04-25 21:06
204 查看
点击打开链接
注意要是求的字符串和逆串的公共子序列,和公共子串分开了哦。
思路分析:
1.判断字符串前后俩个字符是否相同,如果相同,则删去这俩字符,判断剩余的字符,不需要添加字符。
2.如果不相同,则添加最少的字符的数量 = min((在字符串前添加和末尾一样的字符,删除末尾字符,判断其余字符串),(在字符串后添加和前边一样的字符,删除
前边的字符, 判断其余字符串) ) + 1 ;很容易用递归实现,不过考虑到会超时,可以用数组保存计算过程中的结果,避免不必要的重复计算。
第二种思路:
其实就是最长公共子序列的变种,将原序列str倒置后得到tmp。求出最长公共子序列的长度,则这些就是回文字串,剩下的就是没有匹配的字符的个数。用总长度减去最长公共子序列的长度,就得到需要添加的字符数量。
第一种思路是区间dp。
注意要是求的字符串和逆串的公共子序列,和公共子串分开了哦。
思路分析:
1.判断字符串前后俩个字符是否相同,如果相同,则删去这俩字符,判断剩余的字符,不需要添加字符。
2.如果不相同,则添加最少的字符的数量 = min((在字符串前添加和末尾一样的字符,删除末尾字符,判断其余字符串),(在字符串后添加和前边一样的字符,删除
前边的字符, 判断其余字符串) ) + 1 ;很容易用递归实现,不过考虑到会超时,可以用数组保存计算过程中的结果,避免不必要的重复计算。
第二种思路:
其实就是最长公共子序列的变种,将原序列str倒置后得到tmp。求出最长公共子序列的长度,则这些就是回文字串,剩下的就是没有匹配的字符的个数。用总长度减去最长公共子序列的长度,就得到需要添加的字符数量。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int c[1005][1005]; int main() { int t; char str[1005],s[1005]; scanf("%d", &t); while(t--) { scanf("%s", str); int len=strlen(str); for (int i = 0; i < len; i++) { s[i]=str[len-1-i]; } memset(c,0,sizeof(c)); int x=-999999; for(int i = 1; i<=len ; i++) { for(int j =1; j <=len; j++) { if(str[i-1]==s[j-1]) c[i][j]=c[i-1][j-1]+1; else c[i][j]=max(c[i][j-1],c[i-1][j]); if(x<c[i][j]) x=c[i][j]; } } printf("%d\n",len-x); } return 0; }
第一种思路是区间dp。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int xx= 1e3; int dp[xx][xx]; int main() { int T; scanf("%d", &T); while(T--) { char str[xx]; scanf("%s",str); int len=strlen(str); memset(dp,0,sizeof(dp)); for(int i=0;i<len;i++) dp[1][i]=dp[0][i]=0; for(int i=2;i<=len;i++) for(int j=0;j<=len-i;j++) { if(str[j]==str[j+i-1]) dp[i][j]=dp[i-2][j+1]; else dp[i][j]=min(dp[i-1][j+1],dp[i-1][j])+1; } printf("%d\n",dp[len][0]); } return 0; }
相关文章推荐
- 整理一下编程中用到的各种数据类型转换
- 【整理】MFC下 各种字符串类型之间转换(MSDN及其他写法)
- 字符串问题---添加最少字符使字符串整体都是回文字符串
- Visual C++ 如何:在各种字符串类型之间进行转换
- 整理一下js判断移动端的各种浏览器
- (整理)c++中找出各种数据类型的取值范围
- mfc 在各种字符串类型之间进行转换
- 整理一下当年的学习笔记之:SpringMVC的各种参数绑定方式
- Unity3D细节整理:AssetBundle对应的各种格式文件的类型
- 【二】c#类和对象,都是已经很熟悉的东西,看到了就随手整理一下
- Spring AOP使用整理:各种通知类型的介绍
- C++各种字符串类型之间的转换
- C#常用各种类型转json字符串
- C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte
- MFC下的各种字符串类型和相互转换
- 给定一个字符串s,求子串都是回文的集合。
- 我刚刚写了一个map的题目,还用到了#include<string>的头文件,下面我来总结一下 map<类型>变量 q q.find(找字符串) q.end()是否到达末尾
- 如何在各种字符串类型之间进行转换(VS2010)
- 整理出的各种类型的字节数
- 如何:在各种字符串类型之间进行转换