1、题目描述

        给你一句话,然后再给你一个字典,请把这句话中的所有单词替换成该单词在字典中的索引,不区分大小写。句子中包括","以及空格等符号,这些符号不变,且""之中的单词不会被替换。

示例:

输入:

句子: Hello, I will go to the "New World Park".

字典: hEllo TO park

输出:

注意:park在""内,因此不替换。

2、思路

本题有两个要点:一、把这句话中的所有单词替换成该单词在字典中的索引,不区分大小写。 二、""之中的单词不会被替换。 这题我使用了双指针法,快慢指针同时指向最后一个字母,为什么要指向最后的字母,而不是指向第一个字母,可以参考代码随想录,附上的链接如下:https://www.programmercarl.com/

        首先针对第一个要点:当快指针没有遇到逗号、空格、句号和分号的时候,慢指针一直停留在某个单词的最后一个字母,快指针一直往前移动,直到遇到逗号、空格、句号和分号的时候,读取快慢指针之间的单词,并且判断该单词是否在字典里面,如果在则替换成数字,如果不在字典里则不需要做替换操作。然后慢指针移动到快指针的位置,重复以上的操作,就可以完成单词替换。

        针对第二个要点:在分号里面的内容不变化,只要设置标志位即可。我在本题中,是从后往前读,当遇到奇数个分号时,不做任何的替换,直到遇到偶数个分号时,才做替换的操作。(为什么标志位为奇数的时候,不做替换操作,是因为当标志位为奇数时,指针读取到的内容是属于分号内的内容)

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:])   # 输出