10分钟学会一道leetcode题,巩固数据结构姿势003

适合对算法一窍不通的初学者。

本专栏目前还没有什么读者,食用后请点赞支持一下我的专栏,让更多人看到。

本人对写文章没有太多经验,有宝贵意见和建议请直接留言或者私信告诉我,万分感谢。


为弱化语言特性,本文使用python.

Longest Substring Without Repeating Characters - LeetCode​leetcode.com
图标
image

1.审题

题目中强调是subsequence而不是substring,说明有序性的重要性。

本题要我们找到一个subsequence没有重复的character

2.确定Input/Output

Input: 一个字符串s

Output: 一个integer,表示最长subsequence的长度

3.选用数据结构

我们这里肯定要用到引用数据类型,这是毋庸置疑的。

如果直接考虑存储这个字符串的所有信息,我们需要一个tree,或者graph(如果考虑环的存在,但显然用graph是不明智的)

如果只考虑截断字符串的规则,我们需要一个字母和index对应的数据结构,key-value pair == dictionary

Solution 1: 选用字典

class Solution(object):
def lengthOfLongestSubstring(self, s):

    prev = 0
    ans = 0
    dict = {}

    for i,j in enumerate(s):
        if j not in dict:
            dict[j] = i
        else:
            # 保证prev是不重复字符串的前端
            prev = max(dict[j] + 1, prev)   
            dict[j] = i
        # 保证ans在字符串末尾得到更新
        ans = max(ans, i + 1 - prev)

    return ans

评价:这个解法使用了dictionary,巧妙地利用了dictionary无序不重复以及key, value都可赋值的特性。

思路分析:

字典的key用于存放一个值,value用于存放另一个相关值。

具体到这道题,由于没有重复的字符,那么重复的字符代表我们需要对sequence进行切割。

而我们面临的第二个问题是:单纯的根据某个字符串进行切割是不全面的

如对于 abac, 如果我们只考虑对a进行切割,那么只能得到ab或者ac,最后返回2

但实际上,我们可以切割出bac,这种情况下需要我们考虑对b进行切割。

如果你有一定的编程熟练度和逻辑思考能力,那么可以轻易地分析出这个问题可以抽象成参数不同的对单个字符的切割字符串的问题(即多个参数的简单函数)

对于这种情况,我们可以选择牺牲时间或者空间。

对于字符串这种非常小的数据,显然多用一些空间是更划算的。(即:对每个不同的char进行存储)

这道题中我们选择了dictionary用来存储各个字符是否出现过的信息。

Solution2: 选用Tree

使用Tree的思路更加清晰。

我们可以对任意的字符串画出一个Tree,依照如下例子的规则。

举几个例子:

如abcbcacb, 我们可以画出:

image
  1. a-b-c

  2. b 已存在, 另起一支

  3. b-c-a

  4. c 已存在, 另起一支

  5. c-b

由于我们已经得到了几何化的tree,最终我们可以得到abc或者bca是最长路径,结果为3.

如 abcbcd, 我们可以画出:

image
  1. a-b-c

  2. b 已存在,另起一支

  3. b-c-d

如此这般,问题就转化为了Tree的最大深度问题。

由于在网吧敲键盘很不爽所以略,之后github贴C语言ADT实现代码。

由于是作为recap而写,就不用连内存都不需要管的python了。

Tree相关的方法全是靠recursion来写,之后补上recursion的经典例子作为补充链接。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,970评论 0 13
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,719评论 0 33
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,292评论 0 19
  •  今天真的好热!我感觉自己应该又黑了一个度了,希望回家的时候不要变成非洲人。 今天上午我们去了梦时代,跟一队美容院...
    木羊森1998阅读 174评论 0 0
  • 这题被一堆人点反对。本身比较怪。本来我想,abc跟adbec这种,最长不同子序列不应该是-1吗,但其实是5,因为a...
    DrunkPian0阅读 109评论 0 0