zoukankan      html  css  js  c++  java
  • 最长回文串

    1160. 拼写单词

    给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars

    假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。

    注意:每次拼写时,chars 中的每个字母都只能用一次。

    返回词汇表 words 中你掌握的所有单词的 长度之和

    示例 1:

    输入:words = ["cat","bt","hat","tree"], chars = "atach"
    输出:6
    解释: 
    可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。
    

    示例 2:

    输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
    输出:10
    解释:
    可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。
    
    def countCharacters(words, chars) -> int:
        results = ""
        from collections import Counter
        for word in words:
            vocab = Counter(chars)#字典存储每个字符出现次数
            result = ""
            for w in word:#对每个单词,如果所有的字符都在字典中出现,且字母个数满足要求
                if w in vocab and vocab[w]>0:
                    result += w
                    vocab[w] -= 1 
                else:
                    break
            if len(result)==len(word):
                results += result
        return len(results)
    
    #如果词中所有字符出现过,该词满足要求
    def countCharacters(words, chars) -> int:
        ans = 0
        from collections import Counter
        vocab = Counter(chars)
        for word in words:
            dic = Counter(word)
            for w in dic:
                if dic[w] > vocab[w]:
                    break
            else:   #for 循环被break后,else语句就不会执行
                ans += len(word)
        return ans
    

    5. 最长回文子串

    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

    示例 1:

    输入: "babad"
    输出: "bab"
    注意: "aba" 也是一个有效答案。
    

    示例 2:

    输入: "cbbd"
    输出: "bb"
    
    #暴力法,找出所有子串,判断是否为回文,记录长度
    #超出时间限制
    def longestPalindrome(s):
        maxlen = 0
        result = ""
        if not s:
            return ""
        if len(s)<2:
            return s
        #找子串
        for i in range(len(s)):
            for j in range(i+1):
                substr = s[j:i+1]
                #判断子串是否为回文串,是就记录长度
                sub_len = is_palindrome(substr)
                if  sub_len > maxlen:
                    maxlen = sub_len
                    result = substr
        return result
    
    def is_palindrome(s):
        left,right = 0,len(s)-1
        while left<right:
            if s[left] != s[right]:
                return 0
            left += 1
            right -= 1
        return len(s)
    
    # 中心展开
    #如果子串为回文,向两侧展开,左右相等同样为回文
    def longest_palindrome(s):
        start,end =0,0
        for i in range(len(s)):
            len1 = expand(s,i,i)#回文长度为奇数
            len2 = expand(s,i,i+1)#回文长度为偶数
            maxlen = max(len1,len2)
            if maxlen > end-start:
                start = i-(maxlen-1)//2
                end = i+maxlen//2
        return s[start:end+1]
    
    def expand(s,left,right):
        L,R = left,right
        while L >=0 and R <len(s) and s[L]==s[R]:
            R += 1
            L -= 1
        return R-L-1
    
  • 相关阅读:
    rsync+inotify实现实时同步,自动触发同步文件
    Linux下实现Rsync目录同步备份
    零基础学python-16.2 作用域法则
    零基础学python-16.1 作用域快速入门
    零基础学python-15.4 函数的多态vs对象的多态
    零基础学python-15.3 函数的定义、调用与多态
    零基础学python-15.2 分解函数
    零基础学python-15.1 为什么需要编写函数
    零基础学python-14.3 python的文档资源:help函数
    零基础学python-14.2 python的文档资源:文档字符串
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/12511662.html
Copyright © 2011-2022 走看看