SRM589 DV1 250 回文字符串
其实这道题挺简单的,不过刚开始我钻了一个错误的死胡同。想明白之后才发现
。
题目要求用最少的时间来将一个字符串变成回文字符串。(具体题目参看topcoder srm589 DV1 250分值的题目,不便公开以免影响后面做题的人)
- 首先对于(i,j),如果i=n-1-j, 那它们所代表的位置的字符最终必须相等,否则就不是回文了。S[i]=S[j];
- 如果源字符串S中,S[i]=S[j], 那么在最终的回文字符串中,它们必须还是相等。因为如果S[i]要变成其他字符,那么S[j]也必须跟着变。即它们要不都变,要不都不变。
- 可传递性:(i,j,k) 如果S[i]=S[j] 且 S[k]=S[j] 那么最后一定有S[i]=S[k]。因为它们都是必须保证最后相等的。
- 将必须相等的位置放在一起,相当于连一条边,而位置是点,这些点都是最后必须统一成一个字符的。这样S就被分成好几个连通分量。例如aabd z dfgh就会被分成3组:(a,a,g,h),(b,d,d,f)(z)每一组最终都是必须变成同一个字符。
- 分好组后就变得很清晰了,只要让每组变成同一个字符,使得变化的字符个数最少即可。那就是总字符数减去最多的那个字符的个数。例如(a,a,g,h)就需要4-2=2个变换,即g,h变成a,a不动就行。
- 最后将每一组的变换次数加起来就是最终的结果。
代码如下(java版):
package srm589;
public class SRM589DV1s250 {
private boolean[] visited = new boolean[50];
public int getmin(String S)
{
int result = 0;
for(int i=0;i<S.length();i++){
int[] count = new int[27];
dfs(i,S,count);
int total=0;
int max=0;
for(int j=0;j<count.length;j++){
total+=count[j];
if(max<count[j])
max = count[j];
}
result += total-max;
}
return result;
}
private void dfs(int k,String S,int[] count){
if(!visited[k]){
visited[k]=true;
count[S.charAt(k)-'a']++;
for(int i=0;i<S.length();i++){
if(S.charAt(i)==S.charAt(k)||i+k==S.length()-1){
dfs(i,S,count);
}
}
}
}
public static void main(String[] args) {
SRM589DV1s250 srm = new SRM589DV1s250();
System.out.println(srm.getmin("abaabb"));
}
}
SRM589 DV1 250 回文字符串的更多相关文章
- [LeetCode] Valid Palindrome 验证回文字符串
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- 回文字符串的判断!关于strlen(char * str)函数
#include <stdio.h> #include <string.h> int ishuiw(char * p); int main() { ;//true-false接 ...
- NYOJ_37.回文字符串 (附滚动数组)
时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问 ...
- 131. 132. Palindrome Partitioning *HARD* -- 分割回文字符串
131. Palindrome Partitioning Given a string s, partition s such that every substring of the partitio ...
- leetcode:Longest Palindromic Substring(求最大的回文字符串)
Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...
- 【又见LCS】NYOJ-37 回文字符串
[题目链接] 回文字符串 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba& ...
- [NYOJ 37] 回文字符串
回文字符串 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当 ...
- 最长回文字符串(manacher算法)
偶然看见了人家的博客发现这么一个问题,研究了一下午, 才发现其中的奥妙.Stupid. 题目描述: 回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串. ...
- 1042 数字0-9的数量 1050 循环数组最大子段和 1062 序列中最大的数 1067 Bash游戏 V2 1092 回文字符串
1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次 ...
随机推荐
- ie条件注释还能这样写
通过条件注释给html开始标签定义不同的class, 来区分不同版本的IE,可以在样式表中避免 样式属性hack (如 _margin-top, *float:none ) 注意: IE10+不支持条 ...
- 「JAVA」:Berkeley DB的JAVA连接
Berkeley DB是一个嵌入式的数据库,它适合于管理海量的.简单的数据.关键字/数据(key/value)是Berkeley DB用来进行数据管理的基础.每个key/value构成了一条记录,而整 ...
- iOSAPP启动时实现加载广告
现在很多APP在启动的时候都在加载广告,现在也很流行,主要是盈利啊.笔者也做了很多关于广告的事情.现在记录下自己在APP启动的时候,怎么加载广告的. 下面总结下广告加载的三种方式 1.现在很多APP的 ...
- 驱动: 中断【1】linux中断流程
通常情况下,当一个给定的中断处理程序正在执行时,所有其他的中断都是打开的,所以这些不同中断线上的其他中断都能被处理,但当前中断总是被禁止的. 将中断处理切为两个部分或两半.中断处理程序上半部(top ...
- Javascript DOM 03 表格添加、删除 + 搜索
获取 tBodies.tHead.tFoot.rows.cells 隔行变色 鼠标移入高亮 添加.删除一行 DOM方法的使用 ...
- 我的Python成长之路---第三天---Python基础(12)---2016年1月16日(雾霾)
四.函数 日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”以实现.在编程的世界里,“功能”可称呼为“函数”,因此“函数”其实就是一段实现了某种功能的代码,并且可以供其它代 ...
- 0x3f3f3f3f...编程中无穷大常量的设置技巧
转自 http://aikilis.tk/ 如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值. ...
- FreePascal的VMT与Delphi不一致,没有负方向
因为不需要与C++兼容嘛:http://www.freepascal.org/docs-html/prog/progsu168.html 如果要想取得它真正的VMT,可以Pointer强行转换+100 ...
- phpMyAdmin 手动输入数据库服务器IP
1 在phpMyAdmin安装目录下查找config.inc.php,如没有则拷贝config.sample.inc.php为config.inc.php 2 修改config.inc.php,加入$ ...
- Android基础【1】杀死进程(强行停止)应用程序的方法
写在前面: 进入手机ODM已经很久,经历过几个项目项目下来,对高通.展讯.Marvell平台都进行了接触,对于我个人来说,参与手机系统项目的开发与维护,最明显的好处是可以深入的了解某一功能的具体实现过 ...