题解 | #判断是不是子字符串#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.
全部评论

相关推荐

竟然收到了测评听说是双机位
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
程序员牛肉:1.大头肯定是院校问题,这个没啥说的。 2.虽然有实习,但是实习的内容太水了,在公司待了七个月的时间,看起来就只做了jwt和接入redis。爬取新闻,数据导入。这几个需求值得你做七个月吗?这不就是三四个月的工作量吗?我要是面试官的话真心会认为你能力不太行。所以既然有实习了,一定要好好写,像是Swagger这种东西是真没必要写上去,就拉一个包的事情。 3.我个人觉得话,在校生不要把自己当社招看,除非你的项目是特别牛逼,特别有名的含金量,否则不要写这种密密麻麻的一串子工作职责。你的项目只有一个作用,就是供面试官从中来抽取八股对你进行拷打。 但是你现在这个看不来什么技术点,可以改一下,详细表述一下你用什么技术实现了什么功能,在实现这个功能的过程中,你解决了什么难题。
点赞 评论 收藏
分享
07-30 11:23
门头沟学院 Java
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务