102 - 最长回文串
题目
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
注意: 假设字符串的长度不会超过 1010。
示例 1:
输入: "abccccdd"
输出: 7
解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
解答
可以用map,或者用数组。记录一下有没有相同的。遇到相同的就+2。
var longestPalindrome = function (s) {
let data = new Array(58)
let res = 0
for (const item of s) {
const code = item.charCodeAt() - 65
if (data[code] === 1) {
res += 2
data[code] = 0
} else {
data[code] = 1
}
}
if (res < s.length) {
res++
}
return res
};
Runtime: 60 ms, faster than 74.08% of JavaScript online submissions for Longest Palindrome.
Memory Usage: 35.5 MB, less than 60.00% of JavaScript online submissions for Longest Palindrome.
这里偷了点懒,新建了58个的数组之后,里面的都是undefined,但是只要不是1,无论是第一次遇到的undefined还是有对象的0,就都令为1即可
就可以免去把数组全令0的for循环了。
最后如果还有剩下的,那么最多只能拿一个出来放在中间,因此就把结果++即可。
func longestPalindrome(s string) int {
data := make([]byte, 58)
var res int
for _, val := range s {
fmt.Println("val", val,val-65)
code := val - 65
if data[code] == 1 {
res += 2
data[code] = 0
} else {
data[code] = 1
}
}
if res < len(s) {
res++
}
return res
}
Runtime: 0 ms, faster than 100.00% of Go online submissions for Longest Palindrome.
Memory Usage: 2.1 MB, less than 100.00% of Go online submissions for Longest Palindrome.
class Solution:
def longestPalindrome(self, s: str) -> int:
data = [0] * 58
res = 0
for i in s:
code = ord(i) - 65
if data[code] == 1:
res += 2
data[code] = 0
else:
data[code] = 1
if res < len(s):
res += 1
return res
Runtime: 44 ms, faster than 23.71% of Python3 online submissions for Longest Palindrome.
Memory Usage: 13.7 MB, less than 8.33% of Python3 online submissions for Longest Palindrome.
题解的方法看不太懂,所以我觉得我想的方法比题解好🙈
Last updated
Was this helpful?