巧用贪心算法,计算出字符串回文

作者&投稿:於净 (若有异议请与网页底部的电邮联系)
~ 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

注意:
假设字符串的长度不会超过 1010。

示例 1:

输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

请注意!!!

题目的意思是:利用这个字符串中的所有字母来构造最长回文串,是构造!是可以改变字母出现的位置顺序的!字母位置可以任意移动。而不是在顺序不变的情况下找出最长的回文串。

作者一开始粗心大意没理解题意,直接上手做题吃大亏(捂脸。

现在来解释下,什么是回文?

回文串是一个正着读和反着读都一样的字符串。

来看两个不同的回文例子:

AB|BA。仅看字母,我们发现,AB和BA根据中心竖线|对称,这个回文串长度为4,每个字母出现的次数都是偶数。
ABCBA。我们发现,AB和BA根据字母C对称,这个回文串长度为5,除了对称中心的字母C仅出现过一次外,中心两边的字母出现次数都是偶数。
所以我们可以总结出,如果想要构造出一个回文串,除了回文串中心的字母只能出现一次外(如果有中心字母的话),中心两边的字母还需对称出现,即出现偶数次。

解决了构造回文串这一关键点,题目中还有一个特别之处:仅出现大写字母和小写字母。

如果对英文字母的Unicode编码熟悉的话,可以知道,字母A的Unicode编码是65(十进制),字母Z的Unicode编码是90(十进制),字母a的Unicode编码是97(十进制),字母z的Unicode编码是122(十进制)。

可以发现它们是Unicode编码是连续(中间的91到96并不重要),即有序的,所以可以使用数组来存放它们,每个数组项的值就是每个字母出现的次数。

这种情况下,使用数组来存储,会比使用哈希表(Map)来存储来得更高性能,哪怕Unicode编码的91到97我们无需使用。

且,在JavaScript世界中,可以使用String.prototype.charCodeAt()这一API来获取Unicode编码单元。

所以,我们可以这样来统计每个字母出现的次数:


[算法] 贪心算法证明思路
动态规划和贪心算法都需要问题具有最优子结构,但不同的是贪心 自顶向下 ,先做选择再求解一个结果子问题,而动态规划自底向上求解子问题,需要先求出子问题的最优解再做选择。这是因为,动态规划最优解有两个子问题时,求解子问题 时有j-i-1种选择,但贪心选择特征能够使 其中一个子问题必定为...

重学数据结构与算法系列:一文讲透贪心算法
引言 人之初性本善,但是随着自身的经历、生活环境等因素的影响,人逐渐会生出贪嗔痴。实际上不光人有贪念,我们的算法也会有贪念,今天就和大家介绍下一个有贪念的算法模型——贪心算法,看看一个算法是怎么产生贪念的。什么是贪心算法 在分析和求解某个问题时,在每一步的计算选择上都是最优的或者最...

贪心算法:有一个n个不等整数的数组,每次删a,b,加入a*b+1,如此下去直到...
\/\/这个应该很简单吧 include <stdio.h> void main(){ int n,data[100],a,b,i;printf("请输入数组个数:");scanf("%d",&n);printf("数组值:");for(i=0;i<n;i++)scanf("%d",&data[i]);for (i=0;i<n-1;i++){ a=data[i];b=data[i+1];data[i+1]=a*b+1;} print...

图解!一文带你玩转贪心算法!
关于理论上的东西你只要了解就行,你想学好贪心别无他法。就是要多做题多练习,见的多了就有感觉了。其实一连套的动作就是:诶,这道题看着能用贪心,试试,得出个结果,找几个特例验一验,是最优解万事大吉,不是最优解,就再想想是不是动态规划啥的可以解。最后再说一句,贪心算法不用慌,退...

贪心算法
第六步:对权值为1的边重复上一步,当一条边被使用一次其权值增加1,直到所有边的权值均为2为止(除e1,e2,…,em外)。贪心算法2中,第一步耗费O(nlgn);第二步需要计算n-1次距离与n-2次比较;第三步求pk要计算n-2次的距离与n-3次比较;第四步要进行(n-3)×3次的距离计算及(n-4)×3...

如何解最优服务次序
六、算法测试结果 七、算法复杂性分析 程序主要是花费在对各顾客所需服务时间的排序和贪心算法,即计算平均服务时间上面。其中,贪心算法部分只有一重循环影响时间复杂度,其时间复杂度为O(n):而排序算法的时间复杂度为O(nlogn)。因此,综合来看算法的时间复杂度为O(nlogn)。八、参考文献 [1] 王晓东...

背包问题贪心算法时间复杂度
贪心算法的基本思想是总是选择当前看来价值最大的物品。在背包问题中,我们首先按照物品的单位重量价值(即价值\/重量)从大到小排序,然后从价值最高的物品开始,尽可能多地放入背包,直到背包满为止。贪心算法的时间复杂度主要取决于排序的复杂性。为了对物品按照单位重量价值进行排序,我们可以使用任何内部...

如何用贪心算法解决磁盘文件最优存储问题?
dp??方程为 a(fi,fj)=min{(a(fi,fk)+a(fk,fj)),a(fi,fj)}(k=i+1,i+2...j-1);

找零钱问题的贪心算法
问题描述:存在面值为2角5分、1角、5分、1分的硬币,需要找出找零n分钱的最佳方案,要求使用的硬币数量最少。问题分析:在日常生活中,我们购物时店主找零通常会先使用最大面值的硬币,如果不够则会尝试使用面值较小的硬币,直到找零金额凑齐。这种找零方式遵循了贪心算法的思想。实际上,如果店主全部...

贪心算法的基本思想是什么?
若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。贪心算法可解决的问题通常大部分都有如下的特性:1、随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的...

广宗县15368828415: 运用贪心法和递归调用求解的题目各一题 -
掌胞独一: 贪心法: 删数问题:(shanshu) 键盘输入一个高精度的正整数N(此整数中没有'0'),去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和S...

广宗县15368828415: 如何判断一个字符串是否包含另一个字符串 -
掌胞独一: 包含有两种意思: 字符串t是字符串s的字串(t的每个字符在s中顺序排列,但不一定连续),例如"srt"被包含于"ehiseriutey" 字符串s的某段与字符串t相等(t的每个字符在s中顺序排列,且连续),例如"skir"被包含于"hskskirtnn" 对于...

广宗县15368828415: C语言算法,用贪心法 -
掌胞独一: 贪心算法虽然不是最好的,但毕竟是你要求的... 随机取一个人, 循环开始:随机取一个没接水的人, 比较两个人的接水时间大小,让小的先接. 累加总等待时间为接水时间. 循环体结束. 输出平均接水等待时间累加T/人数n

广宗县15368828415: 贪心算法实现哈夫曼编码 -
掌胞独一: // 哈夫曼编码(算法)#include <stdio.h> #include <stdlib.h> #include <string.h>typedef char *HuffmanCode; //动态分配数组,存储哈夫曼编码typedef struct {unsigned int weight; //用来存放各个结点的权值unsigned int parent,LChild,RChild...

广宗县15368828415: c语言问题急!!!(用贪心算法) -
掌胞独一: 题分析:根据常识,我们到店里买东西找钱时,老板总是先给我们最大面值的,要是不够再找面值小一点的,直到找满为止.如果老板都给你找分数的或者几角的,那你肯定不干,另外,他也可能没有那么多零碎的钱给你找.其实这就是一个...

广宗县15368828415: 如何用贪心算法求解tsp问题 -
掌胞独一: 最快回答那个不懂别乱说,别误人子弟.这题标准的贪心算法,甚至很多时候被当做贪心例题 要求平均等待时间,那么就得用 总等待时间 / 人数 所以只用关心总等待时间,如果数据大的在前面,那么后面必然都要加一次这个时间,所以按从小...

广宗县15368828415: 使用python贪心算法和蛮力算法解决问题~~ -
掌胞独一: # coding:utf-8 """定义一个函数,名字为sameSums(aList),alist是一个整形list(限定重复元素不超过2个,排2f0e除这样的list,元素前后差为1,[4,5,6,7,8]),函数作用是判断能分成两组,使得两组数字的和相等.若可以择返回值是true,若不...

广宗县15368828415: C语言关于贪心算法的(很简单) -
掌胞独一: LZ在开始研究ACM嘛?#include int least_num_cash(int _money){ /*直接贪心,能用大张的钞票尽量用大张的*/ int ret=0; while(_money!=0) { if(_money>=100...

广宗县15368828415: 贪心算法问题 -
掌胞独一: 这道题的贪心算法比较容易理解,我就不多说明了,只是提到一下算法思路1、建立数学模型描述问题.我在这里将时间理解成一条直线,上面有若干个点,可能是某些活动的起始时间点,或终止时间点.在具体一下,如果编程来实现的话,将...

广宗县15368828415: C语言关于贪心算法的(很简单) -
掌胞独一: long a,b,s,k,num,c[7]={100,50,20,10,5,2,1} //a,顾客付款;b,实际售价;num找钱数. for(s=a-b,k=0,num=0;k<7 && s>0;k++){num+=(long)s/c[k];s-=num*c[k]; } printf ("%d",num);//k可以不要

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网