我在使用此代码时遇到了一些问题。 这是参数
给出一个字,找到" mop"的最小宽度。需要删除每个字母。
实施例
对于word =" abacaba",输出应为 theJanitor(word)= [7,5,1,0,0,...,0,0](共26个元素)。
def theJanitor(word):
left = [0] * 26
right = [0] * 26
was = [0] * 26
for i in range(26):
left.append(0)
right.append(0)
was.append(False)
for i in range(len(word)):
c = ord(word[i]) - ord('a')
if was[c]:
left[c] = i
was[c] = True
right[c] = i
ans = []
for i in range(26):
ans.append(right[i] - left[i] + 1 if was[i] else 0)
return ans
答案 0 :(得分:1)
查找每个字母的第一个和最后一个
for letter in 'abc...':
left_index = text.find(letter)
right_index = text.rfind(letter)
mop_size = right_index - left_index + 1
答案 1 :(得分:0)
我建议使用与原始代码相比有点不同且更清晰的方法:
def theJanitor(word):
let = sorted(set(word))
mop_len = [word.rfind(c) - word.find(c) + 1 for c in let]
mop_len += [0]*(26-len(mop_len))
return mop_len
使用set(word)
程序会找到按字母顺序排序的每个单词中的所有唯一字母。对于每个字母,它根据出现的第一个和最后一个索引计算拖把宽度。在最后一行中,拖把宽度的数组用零填充到目标长度26。
如果您希望按发生顺序显示您的字母,请使用此代替set
方法,
let = [x for i, x in enumerate(word) if x not in word[0:i]]
答案 2 :(得分:0)
@blue_note建议使用word.find()
似乎是最简单的方法,但这是原始代码精神的“低级”版本:
def janitor(word):
left = [None] * 26
right = [None] * 26
widths = []
for i, c in enumerate(word):
k = ord(c) - ord('a')
if left[k] is None:
left[k] = i
right[k] = i
for k in range(26):
if left[k] is None:
width = 0
else:
width = right[k] - left[k] + 1
widths.append(width)
return widths
答案 3 :(得分:0)
您可以同时使用rfind
和find
import string
def janitor(word):
alphabets = string.ascii_lowercase
result = [0]*26
for i in word:
index = alphabets.find(i)
if word.rfind(i) < 0:
result[index] = 0
else:
result[index]=word.rfind(i) - word.find(i) + 1
print(result)
if __name__ == '__main__':
janitor('abacaba')
输出:
[7, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]