434.字符串中的单词数 ⭐
438.找到字符串中所有字母异位词 ⭐⭐⭐
459.重复的子字符串 ⭐⭐
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 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 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. 检测大写字母
题目描述
给定一个单词,你需要判断单词的大写使用是否正确。
我们定义,在以下情况时,单词的大写用法是正确的:
- 全部字母都是大写,比如”USA”。
- 单词中所有字母都不是大写,比如”leetcode”。
- 如果单词不只含有一个字母,只有首字母大写, 比如 “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()