「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
[单词规律]
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", str = "dog cat cat dog" 输出: true 示例 2:
输入:pattern = "abba", str = "dog cat cat fish" 输出: false 示例 3:
输入: pattern = "aaaa", str = "dog cat cat dog" 输出: false 示例 4:
输入: pattern = "abba", str = "dog dog dog dog" 输出: false 说明: 你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。
分析过程:
- 将pattern 和 s 处理一下变成列表
- 先判断两个列表长度是否一致,不一致显然不符合要求
- 之后对数据进行zip处理,将pattern 的值作为key s的值作为value存储,判断对应的值是否都一致,不一致显然不符合条件,如果都一致,那么就说明符合条件。
class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
patternlist = [row for row in pattern]
slist = s.split(' ')
if len(slist) != len(patternlist):
return False
res = dict(zip(patternlist, slist))
if len(list(set(res.values()))) != len(list(res.values())):
return False
for i,item in enumerate(patternlist):
if res[item] != slist[i]:
return False
return True
执行结果:
[划分字母区间]
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:
输入:S = "ababcbacadefegdehijhklij" 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
提示:
S的长度在[1, 500]之间。 S只包含小写字母 'a' 到 'z' 。
解题思路: 1.三次遍历 2.遍历区间、合并、计算值
class Solution:
def partitionLabels(self, s: str) -> List[int]:
sDict = {}
for row in range(len(s)):
if s[row] in sDict:
sDict[s[row]][1] = row
else:
sDict[s[row]] = [row, row]
resultlist = []
result = sorted(list(sDict.values()))
for value in result:
if resultlist:
if not value[0] > resultlist[-1][1]:
resultlist[-1][1] = max(resultlist[-1][1], value[1])
continue
resultlist.append(value)
res = []
for word in resultlist: # 计算区间长度
res.append(word[1] - word[0] + 1)
return res
执行结果: