Python实现字符串压缩

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小妹同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值