V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
LeeReamond
V2EX  ›  Python

咨询一个字符串去重算法的实现

  •  
  •   LeeReamond · 2021-03-13 00:11:39 +08:00 · 2658 次点击
    这是一个创建于 1358 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,需求是有一些含有重复字符的字符串,想要得到干净版本

    Waaaaaaaaao! -> Wao!
    

    还有一些两个字符重复的,比如

    hhahahahahaha ! -> hha!
    

    不考虑三字符重复情况。 想了一下,搞一个缓存状态,缓存临近 2 字符似乎实现起来也不难,但总觉得实现起来不太干净的样子。v 友们集思广益一下,有没有什么好的写法。

    第 1 条附言  ·  2021-03-13 14:07:21 +08:00
    感谢大家回复,这个是网站的一个小需求,并不是面试题。之所以描述不严谨是因为需求要求不严格,上例 2 中 hha 和 ha 作为结果都可以接受,任意版本实现皆可,可能唯一需求只有解释速度。

    个人而言我不太想做成一个状态机,左侧逐个输入字串,右侧直接输出。同时亦不需要考虑倒排重复。我个人写 hha 只是因为感觉面对这样一个长字串,hha 能比其他写法较好的保留语义。如果大家集思广益觉得还是做成状态机比较简单,输出 ha 的逻辑比较通顺,反之后者没有什么好办法,那我感觉也能接受。
    17 条回复    2021-03-15 14:31:14 +08:00
    hsfzxjy
        1
    hsfzxjy  
       2021-03-13 00:34:34 +08:00
    正则一把梭
    双字符 re.sub(r'(.{,2}?)(\1)+', r'\1', 'abcabcddddd')
    任意多字符 re.sub(r'(.+?)(\1)+', r'\1', 'abcabcddddd')
    ClericPy
        2
    ClericPy  
       2021-03-13 00:35:19 +08:00
    加强版的零宽断言面试题...? 太晚了先睡觉了
    klesh
        3
    klesh  
       2021-03-13 00:52:47 +08:00 via Android
    hha 不算重复?
    also24
        4
    also24  
       2021-03-13 01:06:08 +08:00   ❤️ 1
    我觉得首先需要明确一下题意,我这里构造一个样例:
    Waaahahah!

    对于这个样例,要怎么处理呢?

    从左至右,一次性处理的话,会先处理 3 个 a,然后处理 2 个 haha:
    W[aaa][haha]h! -> Wahah!

    从右至左,一次性处理的话,会先处理 3 个 ah,然后处理 2 个 a:
    W[aa][ahahah]! -> Waah!

    从左至右,每次只处理一种情况,然后从头开始处理的话,会先处理 3 个 a,然后处理 3 个 ah:
    W[aaa]hahah! -> Wahahah! -> W[ahahah]! -> Wah!
    ericgui
        5
    ericgui  
       2021-03-13 02:07:53 +08:00
    hha -> ha ?

    这个咋办?

    重复两次不算重复?三次以上才算?
    ipwx
        6
    ipwx  
       2021-03-13 02:45:43 +08:00
    楼主得先明确需求。。。
    zxCoder
        7
    zxCoder  
       2021-03-13 08:31:32 +08:00
    hhahahahahaha ! -> hha!

    这个怎么得到的。。。。
    xiadong1994
        8
    xiadong1994  
       2021-03-13 08:51:04 +08:00 via iPhone
    问算法题请先把问题描述严谨了
    AndyAO
        9
    AndyAO  
       2021-03-13 08:56:07 +08:00
    先把需求描述清楚,如果很难,至少给出测试
    Merlini
        10
    Merlini  
       2021-03-13 09:23:46 +08:00 via Android
    我觉得应该是搞一个 vocab,然后递归计算 edit distance 找最近的
    FucUrFrd
        11
    FucUrFrd  
       2021-03-13 09:24:12 +08:00 via Android
    李先生,Python 不是一般人学的,习学生批准了吗
    Merlini
        12
    Merlini  
       2021-03-13 10:06:48 +08:00 via Android
    上面说错,不是递归是回溯
    LeeReamond
        13
    LeeReamond  
    OP
       2021-03-13 14:09:02 +08:00 via Android
    @klesh
    @ClericPy
    @also24
    @ericgui
    @ipwx
    @zxCoder
    @xiadong1994
    @AndyAO
    @Merlini
    感谢回复,已更新题干,另外递归方案肯定不行,原题干里忘说了,这种作为滤镜的逻辑需要速度快一些
    LeeReamond
        14
    LeeReamond  
    OP
       2021-03-13 14:10:09 +08:00 via Android
    另外请各位教我如何举报 11 楼,我 V2EX 使用不熟练
    zxCoder
        15
    zxCoder  
       2021-03-13 14:29:12 +08:00
    @LeeReamond 仍然不清楚你的需求。。。hhahahahahaha ! -> hha! 能解释一下这个怎么来的吗?

    我猜你是要找出一个字符串里所有出现过的字符?
    also24
        16
    also24  
       2021-03-13 15:06:52 +08:00
    @zxCoder #15
    参考我在 4 楼回复的第二种处理方式,从右至左,一次性处理
    (第二个 h 作为右边的 ha 被处理过了,所以没有被开头的 h 吃掉)

    h [ ha-ha-ha-ha-ha-ha ]
    keivenliao
        17
    keivenliao  
       2021-03-15 14:31:14 +08:00
    我在想,这个需求,如果一大段英文做为输入,单个字符作为检测的话,输出岂不是一定为 a 到 z ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2820 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 09:12 · PVG 17:12 · LAX 01:12 · JFK 04:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.