题解 | #判断是不是子字符串#Erlang双指针或动态规划

判断是不是子字符串

http://www.nowcoder.com/questionTerminal/5382ff24fbf34a858b15f93e2bd85307

双指针

解题思路

不断遍历匹配T的头部是否含有S的头部,匹配到时将S头部移除直到空列表即为true

代码

-spec is_subsequence(S :: unicode:unicode_binary(), T :: unicode:unicode_binary()) -> boolean().
is_subsequence(S, T) ->
    TList = binary:bin_to_list(T),
    SList = binary:bin_to_list(S),
    do_is_subsequence(TList, SList).

do_is_subsequence([HeadT | T], S = [HeadS | _]) when HeadT =/= HeadS ->
    do_is_subsequence(T, S);
do_is_subsequence([HeadT | T], [HeadS | S]) when HeadT =:= HeadS ->
    do_is_subsequence(T, S);
do_is_subsequence(_, []) ->
    true;
do_is_subsequence(_, _) ->
    false.

动态规划

解题思路

首先用T建立缓存数据,遍历T并建立每个字母的索引列表

然后再遍历S,查询字母索引列表中是否存在合法索引,即索引值大于当前索引的新索引。

代码

-spec is_subsequence(S :: unicode:unicode_binary(), T :: unicode:unicode_binary()) -> boolean().
is_subsequence(S, T) ->
    TList = binary:bin_to_list(T),
    SList = binary:bin_to_list(S),
    do_cache(TList, #{index => 1, list => SList, cache => #{}}).

do_cache([Word | T], Args = #{index := Index, cache := Cache}) ->
    IndexList = maps:get(Word, Cache, []),
    NewIndexList = IndexList ++ [Index],
    do_cache(T, Args#{index := Index + 1, cache := Cache#{Word => NewIndexList}});
do_cache(_, #{list := SList, cache := Cache}) ->
    do_is_subsequence(SList, #{index => 0, cache => Cache}).

do_is_subsequence([Word | S], Args = #{index := PreIndex, cache := Cache}) ->
    IndexList = maps:get(Word, Cache, []),
    %io:format("cache ~w\n", [Cache]),
    %io:format("word ~w pre_index ~w\n", [Word, PreIndex]),
    case [Index || Index <- IndexList, Index > PreIndex] of
        NewIndexList = [NewPreIndex | _] ->
            NewCache = Cache#{Word => NewIndexList},
            do_is_subsequence(S, Args#{index := NewPreIndex, cache := NewCache});
        _ ->
            false
    end;
do_is_subsequence([], _) ->
    true.
全部评论

相关推荐

评论
2
1
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3136次浏览 43人参与
# HR最不可信的一句话是__ #
1014次浏览 32人参与
# MiniMax求职进展汇总 #
24888次浏览 321人参与
# 春招至今,你的战绩如何? #
14766次浏览 137人参与
# AI面会问哪些问题? #
890次浏览 22人参与
# 你的实习产出是真实的还是包装的? #
2704次浏览 52人参与
# 米连集团26产品管培生项目 #
7065次浏览 224人参与
# 沪漂/北漂你觉得哪个更苦? #
1209次浏览 38人参与
# 你做过最难的笔试是哪家公司 #
1123次浏览 20人参与
# AI时代,哪个岗位还有“活路” #
2675次浏览 49人参与
# XX请雇我工作 #
51147次浏览 171人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7965次浏览 43人参与
# 简历第一个项目做什么 #
32073次浏览 357人参与
# 简历中的项目经历要怎么写? #
310908次浏览 4257人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152823次浏览 888人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187553次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64539次浏览 864人参与
# 如果重来一次你还会读研吗 #
229971次浏览 2011人参与
# 投格力的你,拿到offer了吗? #
178239次浏览 891人参与
# 你怎么看待AI面试 #
180643次浏览 1295人参与
# 正在春招的你,也参与了去年秋招吗? #
364158次浏览 2641人参与
# 腾讯音乐求职进展汇总 #
160820次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务