【算法练习】贪心/leetcode409 最长回文串

目录

 

409. 最长回文串

思路

AC代码


409. 最长回文串

题目链接:https://leetcode-cn.com/problems/longest-palindrome/

难度简单265

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

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

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

示例 1:

输入:
"abccccdd"

输出:
7

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

思路

这个思路还是参考的哈,以后做题还是要自己想想思路。

观察可知,要构造最长的回文串,首先偶数的字符一定要全算进去,奇数个数的字符只算一个

ans是构造的最长回文串的长度,ans是奇数的时候就不再计算奇数个数的字符了

哈希表 存 字符 ->出现的次数(num)

1、先初始化哈希表

2、遍历哈希:

     num%2==0  偶数  ans+=num/2*2【易错注意哈】

     ans+=num/2*2   //直接加上偶数部分

     num%2==1 && ans%2==0  ans++

语法注意:

unordered_map<char, int> count;

遍历哈希表:

for (auto p : count)

遍历string:

for(char c:s)

AC代码

int longestPalindrome(string s) {
    unordered_map<char,int> count;
    for(char c:s){
        count[c]++;
    }
    int ans=0;
    for ( auto it : count ){
        int num= it.second;
       ans+=num/2*2;
        if(num%2==1 && ans%2==0) ans++;
    }
    return ans;
}

别人的思路,数数有多少个字母是出现了奇数次~   妙啊

某个字母出现了奇数次总能化成 偶数次+1

记录出现奇数次字母的种类数 count

如果count==0  ans=s.size()

如果count!=0   ans=s.size()-count+1

return count==0?num:num-count+1;

AC代码 

int longestPalindrome(string s) {
    unordered_map<char,int> mp;
    for(char c:s){
        mp[c]++;
    }
    int count=0;
    int num=s.size();
    for (auto it:mp){
      count+=(it.second %2);
    }
    return count==0?num:num-count+1;
}

或者直接用数组代替map 因为字母有ascii码  参考代码

来源 leetcode 总有一天丶L22020-03-18打卡每日一题!

 public int longestPalindrome(String s) {
        // 找出可以构成最长回文串的长度
        int[] arr = new int[128];
        for(char c : s.toCharArray()) {
            arr[c]++;
        }
        int count = 0;
        for (int i : arr) {
            count += (i % 2);
        }
        return count == 0 ? s.length() : (s.length() - count + 1);
    }

猜你喜欢

转载自blog.csdn.net/weixin_40760678/article/details/113090629
今日推荐