[Swift]LeetCode409. 最长回文串 | Longest Palindrome

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.

Note:
Assume the length of given string will not exceed 1,010.

Example:

Input:
"abccccdd"

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


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

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

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

示例 1:

输入:
"abccccdd"

输出:
7

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

20ms
 1 class Solution {
 2     func longestPalindrome(_ s: String) -> Int {
 3         //
 4         var arr:[Int] = Array(repeating: 0,count: 128)
 5         //遍历字符串
 6         for char in s.characters
 7         {
 8             arr[char.toInt()] += 1
 9         }
10         var ans:Int = 0
11         //遍历数组
12         for i in 0..<128
13         {
14             ans += arr[i] / 2 * 2
15             if ans % 2 == 0 && arr[i] % 2 == 1
16             {
17                 ans += 1
18             }
19         }
20         return ans
21     }
22 }
23     //Character扩展代码
24     extension Character
25     {
26         func toInt() -> Int
27         {
28             var num:Int = Int()
29             for scalar in String(self).unicodeScalars
30             {
31                 num = Int(scalar.value)
32             }
33             return num
34         }
35     }


28ms

 1 class Solution {
 2     func longestPalindrome(_ s: String) -> Int {
 3         var map: [Bool] = Array(repeating: false, count: 128)
 4         var length = 0
 5         for char in s.unicodeScalars {
 6             let value = Int(char.value)
 7             map[value] = !map[value]
 8             if !map[value] {
 9                 length += 2
10             }
11         }
12
13         if length < s.count {
14             length += 1
15         }
16
17         return length
18     }
19 }


28ms

 1 class Solution {
 2     struct CharTracker {
 3             let c: Character
 4             let n: Int
 5         }
 6     func longestPalindrome(_ s: String) -> Int {
 7         var charTracker: [CharTracker] = [CharTracker]()
 8         var pSum = 0
 9         var firstSwitch: Bool = true
10         var cSet = [Character : Int]()
11         s.forEach {
12             cSet[$0, default: 0] += 1
13         }
14         for (_, n) in cSet {
15             if (n & 1) == 0 {
16                 pSum += n
17             } else {
18                 pSum += n - 1
19                 if (firstSwitch) {
20                     pSum += 1
21                     firstSwitch = false
22                 }
23             }
24         }
25         return pSum
26     }
27 }


32ms

 1 class Solution {
 2     func longestPalindrome(_ s: String) -> Int {
 3         var frequencyTable = [Character:Int]()
 4         for ch in s {
 5             frequencyTable[ch] = (frequencyTable[ch] ?? 0) + 1
 6         }
 7
 8         var count = 0
 9         for (key,value) in frequencyTable {
10             if value%2 == 1 {
11                 count += (value-1)
12                 frequencyTable[key] = 1
13             } else {
14                 count += value
15                 frequencyTable[key] = 0
16             }
17         }
18
19         for (_,value) in frequencyTable {
20             if value%2 == 1 {
21                 count += 1
22                 break
23             }
24         }
25
26         return count
27     }
28 }


36ms

 1 class Solution {
 2     func longestPalindrome(_ s: String) -> Int {
 3         var longestPalindrome = 0
 4         var singleChar = 0
 5
 6         // check that the string is not empty
 7         guard s.count > 0 else { return 0 }
 8
 9         // if there is only 1 character, return 1
10         if s.count == 1 {
11             return 1
12         }
13
14         // there can be 1 odd character included
15         // the rest can only be included in multiples of 2
16         // create a hashmap to keep track of the number of occurances
17         var characters = [Character: Int]()
18         for char in s {
19             if let count = characters[char] {
20                 characters[char] = count + 1
21             } else {
22                 characters[char] = 1
23             }
24         }
25
26         // if there‘s a 1 or modulo > 0, set a variable to 1
27         // loop through the characters and divide by 2
28         for key in characters.keys {
29             if characters[key]! % 2 != 0 {
30                 singleChar = 1
31             }
32
33             longestPalindrome += characters[key]! / 2 * 2
34             // divide by 2 to eliminate remainders
35         }
36
37         longestPalindrome += singleChar
38
39         return longestPalindrome
40     }
41 }

原文地址:https://www.cnblogs.com/strengthen/p/9782912.html

时间: 2024-10-08 16:06:39

[Swift]LeetCode409. 最长回文串 | Longest Palindrome的相关文章

【算法】最长回文子串 longest palindrome substring

对于字符串S, 要找到它最长的回文子串,能想到的最暴力方法,应该是对于每个元素i-th都向左向右对称搜索,最后用一个数组span 记录下相对应元素i-th为中心的回文子串长度. 那么问题来了: 1. 这样的方法,对于奇回文子串和偶回文子串的处理不一样,比如所"acbca" 和"acbbca" 2. 计算冗余,e.g. "sscssabcccchccccba"中, 自左向右遍历计算的话,会发现, "abcccchccccba"是

1112个人赛,最长回文串常见算法讨论

ps.此贴大部分文字与代码来自网上,我只是取长补短整理了下 S=“c a b a”  那么  S' = “a b a c”, 这样的情况下 S和 S‘的最长公共子串是aba.没有错误. 但是当 S=“abacdfgdcaba”, 那么S’ = “abacdgfdcaba”. 这样S和S‘的最长公共子串是abacd.很明显abacd并不是S的最长回文子串,它甚至连回文都不是. 现在是不是都明白为什么最长回文子串不能转化成为最长公共子串问题了.当原串S中含有一个非回文的串的反序串的时候,最长公共子串

Manacher(输出最长回文串及下标)

http://acm.hdu.edu.cn/showproblem.php?pid=3294 Girls' research Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 5711    Accepted Submission(s): 2117 Problem Description One day, sailormoon girls

409.求最长回文串的长度 LongestPalindrome

题目要求求出长度即可,并不需要求出最长回文串. 思路:用字典统计每一个字符的出现次数,出现次数大于1的字符必定出现在回文串中,另外还再加上一个中心点. public static int LongestPalindrome(string s) { int length = 0; Dictionary<char, int> dictionary = new Dictionary<char, int>(); int value = 0; foreach (char c in s) {

[译]最长回文子串(Longest Palindromic Substring) Part II

[译+改]最长回文子串(Longest Palindromic Substring) Part II 问题:给定字符串S,求S中的最长回文子串. 在上一篇,我们给出了4种算法,其中包括一个O(N2)时间O(1)空间的算法(中心检测法),已经很不错了.本篇将讨论一个O(N)时间O(N)空间的算法,即著名的Manacher算法,并详细说明其时间复杂度为何是O(N). 提示 +BIT祝威+悄悄在此留下版了个权的信息说: 先想想有什么办法能改进中心检测法. 考虑一下最坏的情况.★ 最坏的情况就是各个回文

hdu--3068 最长回文串(manachar模板)

Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 两组case之间由空行隔开(该空行不用处理) 字符串长度len <= 110000 Output 每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度. Sample Input aaaa

(最长回文串 模板) 最长回文 -- hdu -- 3068

http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12079    Accepted Submission(s): 4430 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长

最长回文子串(Longest Palindromic Substring)-DP问题

问题描述: 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 . 思路分析: 动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串. 则根据回文的规则我们可以知道: 如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1] 当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false. 动态规划的进行是按照字符串的长度从1 到 n推进的. DP算法实现: 1 packa

hdu 3068 最长回文串 o(n) Manacher 算法

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10596    Accepted Submission(s): 3759 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多