1、题目描述
给你一句话,然后再给你一个字典,请把这句话中的所有单词替换成该单词在字典中的索引,不区分大小写。句子中包括","以及空格等符号,这些符号不变,且""之中的单词不会被替换。
示例:
输入:
句子: Hello, I will go to the "New World Park".
字典: hEllo TO park
输出: 0, I will go 1 the "New World Park".
注意:park在""内,因此不替换。
2、思路
本题有两个要点:一、把这句话中的所有单词替换成该单词在字典中的索引,不区分大小写。 二、""之中的单词不会被替换。 这题我使用了双指针法,快慢指针同时指向最后一个字母,为什么要指向最后的字母,而不是指向第一个字母,可以参考代码随想录,附上的链接如下:https://www.programmercarl.com/%E5%89%91%E6%8C%87Offer05.%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC
首先针对第一个要点:当快指针没有遇到逗号、空格、句号和分号的时候,慢指针一直停留在某个单词的最后一个字母,快指针一直往前移动,直到遇到逗号、空格、句号和分号的时候,读取快慢指针之间的单词,并且判断该单词是否在字典里面,如果在则替换成数字,如果不在字典里则不需要做替换操作。然后慢指针移动到快指针的位置,重复以上的操作,就可以完成单词替换。
针对第二个要点:在分号里面的内容不变化,只要设置标志位即可。我在本题中,是从后往前读,当遇到奇数个分号时,不做任何的替换,直到遇到偶数个分号时,才做替换的操作。(为什么标志位为奇数的时候,不做替换操作,是因为当标志位为奇数时,指针读取到的内容是属于分号内的内容)
3、代码实现
s = 'Hello, I will go to the "New World Park".' # 输入的句子
d = 'hEllo TO park' # 输入的字典
s = ' ' + s # 在句子前面加一个空格,保证能够判断完hello这个单词是否在字典里面再跳出while循环
d_dict = {} # 创建一个字典,用来存放d的单词
d = d.lower().split(' ') # 把d的单词全部转换成小写
for i in range(len(d)):
d_dict[d[i]] = i
# 利用双指针
slow, fast = len(s)-1, len(s)-1
flag = 0 # 标志位
while fast>=0:
if s[fast]!=',' and s[fast]!='.' and s[fast]!=' ' and s[fast]!='"':
fast -= 1
else:
if s[fast]=='"':
flag += 1
fast -= 1
slow = fast
if flag%2==1:
fast -= 1
slow = fast
else:
word = s[fast+1:slow+1]
word = word.lower()
if word in d_dict:
s = s[:fast+1] + str(d_dict[word]) + s[slow+1:]
fast -= 1
slow = fast
print(s[1:]) # 输出