错位的梦寐

LeetCode刷题(python)—— 434、438、459、520

2019-12-13


434.字符串中的单词数 ⭐

438.找到字符串中所有字母异位词 ⭐⭐⭐

459.重复的子字符串 ⭐⭐

520. 检测大写字母

434.字符串中的单词数

题目描述

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符 串里不包括任何不可打印的字符。

示例:

输入: “Hello, my name is John”

输出: 5

方法一 :split 函数

Python 的 split 函数,值得注意的是,当对空字符串使用 split 时,会返回空数组。这是由于 Python 会在 split 之前隐式地调用 trim (在Python lingo 中是 strip)。

主要考虑空格的情况,把单词分开,再统计个数就可以了

class Solution:
    def countSegments(self, s):
        return len(s.split())

方法二:原地分割

计算单词的数量,就等同于计数单词开始的下标个数。因此,只需要定义好下标的条件,就可以遍历整个字符串,检测每个下标。定义如下:若该下标前为空格(或者为初始下标),且自身不为空格,则其为单词开始的下标。该条件可以以常数时间检测。最后,返回满足条件的下标个数。

class Solution:
    def countSegments(self, s):
        segment_count = 0

        for i in range(len(s)):
            if (i == 0 or s[i-1] == ' ') and s[i] != ' ':
                segment_count += 1

        return segment_count

438.找到字符串中所有字母异位词

题目描述

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 sp 的长度都不超过 20100。

说明:

  • 字母异位词指字母相同,但排列不同的字符串。
  • 不考虑答案输出的顺序。

示例 1:

​ 输入:

​ s: “cbaebabacd” p: “abc”

​ 输出:

​ [0, 6]

​ 解释:

​ 起始索引等于 0 的子串是 “cba”, 它是 “abc” 的字母异位词。 ​ 起始索引等于 6 的子串是 “bac”, 它是 “abc” 的字母异位词。

示例 2:

​ 输入: ​ s: “abab” p: “ab”

​ 输出: ​ [0, 1, 2]

​ 解释: ​ 起始索引等于 0 的子串是 “ab”, 它是 “ab” 的字母异位词。 ​ 起始索引等于 1 的子串是 “ba”, 它是 “ab” 的字母异位词。 ​ 起始索引等于 2 的子串是 “ab”, 它是 “ab” 的字母异位词。

方法一:

class Solution:
    def findAnagrams(self, s: str, p: str) -> list:

        res = []
        window = {}  # 记录窗口中各个字符数量的字典
        needs = {}  # 记录目标字符串中各个字符数量的字典
        # needs.get(c,0) 如果不存在 键c, 则返回 0
        for c in p: needs[c] = needs.get(c, 0) + 1  # 统计目标字符串的信息

        length, limit = len(p), len(s)
        left = right = 0  # 定理两个指针,分别表示窗口的左、 右界限

        while right < limit:
            c = s[right]
            if c not in needs:  # 当遇到不需要的字符时
                window.clear()  # 将之前统计的信息全部放弃
                left = right = right + 1  # 从下一位置开始重新统计
            else:
                window[c] = window.get(c, 0) + 1    # 统计窗口内各种字符出现的次数
                if right - left + 1 == length:      # 当窗口大小与目标字符串长度一致时
                    if window == needs: res.append(left)  # 如果窗口内的各字符数量与目标字符串一致就将left添加到结果中
                    window[s[left]] -= 1  # 并将移除的字符数量减一
                    left += 1  # left右移

                right += 1  # right右移

        return res

459.重复的子字符串

题目描述

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:

输入: “abab”

输出: True

解释: 可由子字符串 “ab” 重复两次构成。

示例 2:

输入: “aba”

输出: False

示例 3:

输入: “abcabcabcabc”

输出: True

解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)

方法一

假设给定字符串 $s$ 可由一个子串 $x$ 重复 n 次构成,即 $s=nx$ 。 现构造新字符串 $t=2s$ ,即两个 s 相加,由于 $s=nx $,则 $t=2nx$ 。 去掉 $t$ 的开头与结尾两位,则这两处的子串被破坏掉,此时 t 中包含 $2n-2$ 个子串。 由于 $t$ 中包含 $2n-2$ 个子串,$s$ 中包含 n 个子串,若 t 中包含s,则有$ 2n-2>=n$ ,可得 $n>=2$ ,由此我们可知字符串 s 可由一个子串x重复至少2次构成,判定为true;反之,若 t 中不包含s,则有$2n-2<n$ ,可得 $n<2$ ,n 只能为1,由此我们可知字符串 $s=x$ ,假定的子串就为s本身,判定为false。

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        return (s + s)[1: -1].find(s) != -1

方法二

class Solution2(object):
    def repeatedSubstringPattern(self, s):
        """
        :type s: str
        :rtype: bool
        """
        for i in range(1, len(s) // 2 + 1):
            if len(s) % i == 0:
                leng = len(s) // i
                if s[:i] * leng == s:
                    return True
        return False

520. 检测大写字母

题目描述

给定一个单词,你需要判断单词的大写使用是否正确。

我们定义,在以下情况时,单词的大写用法是正确的:

  1. 全部字母都是大写,比如”USA”。
  2. 单词中所有字母都不是大写,比如”leetcode”。
  3. 如果单词不只含有一个字母,只有首字母大写, 比如 “Google”。

否则,我们定义这个单词没有正确使用大写字母。

示例 1:

输入: “USA”

输出: True

示例 2:

输入: “FlaG”

输出: False

注意: 输入是由大写和小写拉丁字母组成的非空单词。

方法一:

内置的字符串函数,isupper ,islower , istitle

class Solution:
    def detectCapitalUse(self, word: str) -> bool:
    	return word.isupper() or word.islower() or word.istitle()

下一篇 朴素贝叶斯

Comments

Content