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; } };