lintcode 627 最长回文串Python版本

Cottbuser 湾区人工智能 今天

作者:Cottbuser 会多国语言的海归 
公众号:湾区人工智能
微博:湾区人工智能
知乎:湾区人工智能
AI QQ群:604562980
一线人工智能工程师独立兼职运营
如果本文对你有帮助,欢迎点赞,转发

数据结构和算法分析是程序员面试必考内容,接下来打算刷常见面试题,顺便分享给大家。刷,刷,刷,一般刷题300道,刷3遍,国内大部分公司offer随便拿。普通程序员刷完中级题目就够了,想进顶级互联网公司,要刷高级题目,想节省时间,可以报个培训班。我个人推荐不差钱的可以报培训班提高效率。

今天题目:

627 最长回文串
描述
给出一个包含大小写字母的字符串。求出由这些字母构成的最长的回文串的长度是多少。

数据是大小写敏感的,也就是说,"Aa" 并不会被认为是一个回文串。

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

您在真实的面试中是否遇到过这个题?  
样例
给出 s = "abccccdd" 返回 7

一种可以构建出来的最长回文串方案是 "dccaccd"。
627 Longest Palindrome
Description
Given a string which consists of lowercase or uppercase letters, find the length of the longest palindromes that can be built with those letters.

This is case sensitive, for example "Aa" is not considered a palindrome here.

Assume the length of given string will not exceed 1010.

Have you met this question in a real interview?  
Example
Given s = "abccccdd" return 7

One longest palindrome that can be built is "dccaccd", whose length is 7.

内容目录

Python版本java版本C++版本

Python版本

class Solution:
    # @param {string} s a string which consists of lowercase or uppercase letters
    # @return {int} the length of the longest palindromes that can be built
    def longestPalindrome(self, s):
        # Write your code here
        hase_set = {}
        #
        #避免hash_set里面有重复,并且建立一个键值对,键就是s里面的字母,值就是true
        for c in s: #去掉s里面出现偶数次的字母,只保留奇数字母
            if c in hase_set:
                del hase_set[c]
            else:
                hase_set[c] = True  #这里的true可以换成任何东西
        print(hase_set)
        remove = len(hase_set)  #所有奇数个字母的长度
        if remove > 0: 
            remove -= 1 #要留一个字母作为回文串中间的字母

        return len(s) - remove  #如果哈希表里有元素,只留一个作为回文串最中间的字母就行。

my_solution = Solution()
s = "fabccccdd"
result = my_solution.longestPalindrome(s)
print(result)

java版本

/**
* 本参考程序来自九章算法,由 @九章算法 提供。版权所有,转发请注明出处。
* - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
* - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,
* - Big Data 项目实战班,算法面试高频题班, 动态规划专题班
* - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code
*/ 

// version 1
public class Solution {
    /**
     * @param s a string which consists of lowercase or uppercase letters
     * @return the length of the longest palindromes that can be built
     */
    public int longestPalindrome(String s) {
        // Write your code here
        Set<Character> set = new HashSet<>();
        for (char c : s.toCharArray()) {
            if (set.contains(c)) set.remove(c);
            else set.add(c);
        }

        int remove = set.size();
        if (remove > 0)
            remove -= 1;
        return s.length() - remove;
    }
}

// version 2
public class Solution {
    public int longestPalindrome(String s) {
        int[] charStatArray = new int[52];
        int oneTimeOddCount = 0;
        int evenCount = 0;

        // zero clearing of the array
        //memset(charStatArray, 0, sizeof(charStatArray));

        // keep the times of appearance of each character in the array
        for (char ch: s.toCharArray()) {
            if (ch >= 97) {
                charStatArray[26 + ch - 'a']++;
            }
            else {
                charStatArray[ch - 'A']++;
            }
        }

        // the answer is the count of characters that has even number of appereances.
        // for characters that has odd number of appereances,
        // their appereances minus 1 will make their apperances even.
        // And finally we can put an unused character in the middle of the palindrome
        // (if there is any).
        for (int cnt: charStatArray) {
            if (cnt != 0) {
                if (cnt % 2 == 0) {
                    evenCount += cnt;
                } else {
                    if (cnt == 1) {
                        oneTimeOddCount++;
                    }
                    else {
                        evenCount += cnt - 1;
                        oneTimeOddCount++;
                    }
                }
            }
        }

        return oneTimeOddCount > 0 ? 1 + evenCount : evenCount;
    }
}

C++版本

/**
* 本参考程序来自九章算法,由 @九章算法 提供。版权所有,转发请注明出处。
* - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
* - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,
* - Big Data 项目实战班,算法面试高频题班, 动态规划专题班
* - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code
*/ 

class Solution {
public:
    int longestPalindrome(string s) {
        int charStatArray[52];
        int oneTimeOddCount = 0;
        int evenCount = 0;

        // zero clearing of the array
        memset(charStatArray, 0, sizeof(charStatArray));

        // keep the times of appearance of each character in the array
        for (char ch: s) {
            if (ch >= 97) {
                charStatArray[26 + ch - 'a']++;
            }
            else {
                charStatArray[ch - 'A']++;
            }
        }

        // the answer is the count of characters that has even number of appereances.
        // for characters that has odd number of appereances,
        // their appereances minus 1 will make their apperances even.
        // And finally we can put an unused character in the middle of the palindrome
        // (if there is any).
        for (int cnt: charStatArray) {
            if (cnt != 0) {
                if (cnt % 2 == 0) {
                    evenCount += cnt;
                } else {
                    if (cnt == 1) {
                        oneTimeOddCount++;
                    }
                    else {
                        evenCount += cnt - 1;
                        oneTimeOddCount++;
                    }
                }
            }
        }

        return oneTimeOddCount > 0 ? 1 + evenCount : evenCount;
    }
};
print_r('点个赞吧');
var_dump('点个赞吧');
NSLog(@"点个赞吧!")
System.out.println("点个赞吧!");
console.log("点个赞吧!");
print("点个赞吧!");
printf("点个赞吧!");
cout << "点个赞吧!" << endl;
Console.WriteLine("转发一下吧!");
fmt.Println("转发一下吧!")
Response.Write("转发一下吧!");
alert(’转发一下吧!’)

认识你是我们的缘分,同学,等等,记得关注我。

 

微信扫一扫
关注该公众号

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值