1.给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
方法一:贪婪
如果有任何一个字符 ch 的出现次数 v 为奇数(即 v % 2 == 1),那么可以将这个字符作为回文中心,注意只能最多有一个字符作为回文中心。在代码中,我们用 ans 存储回文串的长度,由于在遍历字符时,ans 每次会增加 v / 2 * 2,因此 ans 一直为偶数。但在发现了第一个出现次数为奇数的字符后,我们将 ans 增加 1,这样 ans 变为奇数,在后面发现其它出现奇数次的字符时,我们就不改变 ans 的值了。
class Solution {
public:
int longestPalindrome(string s) {
if(s.length()<1) return 0;
map<char,int> m;
int res=0;
for(char c:s)
++m[c];
for(char c='A';c<='z';c++)
{
res+=m[c]/2*2;
if(m[c]%2==1&&res%2==0)//ans为奇数后就不再计算,奇数数量字符多出来的一个字符了
{
res+=1;
}
}
return res;
}
};2.给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:https://leetcode-cn.com/problems/add-two-numbers/
思路:按位相加,如果有进位就记录这个进位。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int sum=0;
ListNode* p1=l1;
ListNode* p2=L2;
ListNode* Head=new ListNode(0);
ListNode* p=Head;
while(p1!=NULL||p2!=NULL||sum>0){
if(p1!=NULL){
sum+=p1->val;
p1=p1->next;
}
if(p2!=NULL){
sum+=p2->val;
p2=p2->next;
}
p->val=sum%10;
sum/=10;//进位标志
if(p1!=NULL||p2!=NULL||sum>0){
p->next=new ListNode(0);
p=p->next;
}
}
return Head;
}
};
京公网安备 11010502036488号