[leetcode/lintcode 题解] Google 面试题:合法组合

2020-07-23 18:41:00 +08:00
 hakunamatata11

给一个单词s,和一个字符串集合str。这个单词每次去掉一个字母,直到剩下最后一个字母。求验证是否存在一种删除的顺序,这个顺序下所有的单词都在str中。例如单词是’abc’,字符串集合是{‘a’,’ab’,’abc’},如果删除的顺序是’c’,’b’,那么’abc’,’ab’,’a’都在集合中,就符合条件。输出这个组合是否符合条件.

样例 1:

输入:s="abc",str=["abc","ac","c"]
输出:true 解释:
首先"abc"在`str`里
删除'b',"ac"在`str`里
删除'a',"c"在`str`里

样例 2:

输入:s="abc",str=["abc","ab","c"]
输出:false 解释: "abc"在`str`里
接下来只能删除'c',"ab"在`str`里
由于"a"和"b"都不在`str`里,所以返回 false

[题解]

考点:

dfs

public class Solution { /**
     * @param s: 
     * @param str: 
     * @return: Output whether this combination meets the condition */ Set<String> map = new TreeSet<String>(); public boolean checkWord(String s, String[] str) { // Write your code here
        if (s.length() > str.length) { return false;
        } if (s.length() == 0) { return true;
        } return dfs(s, str);
    } public boolean dfs (String s, String[] str) { int result = 0; for(int i = 0; i < str.length; i++) { if(str[i].equals(s)) {
                result = 1;
            }
        } if (result == 0) { return false;
        } if (s.length() == 1) { return true;
        } //当前的子串要没被访问过的
        if (map.contains(s)) { return false;
        } for (int i = 0; i < s.length(); i++) { //删除一个字母后的下一个子串
            String next = s.substring(0,i) + s.substring(i + 1); if (dfs (next,str)) { return true;
            }
        } //新的子串放入 map,为之后子串检查访问情况
 map.add(s); return false;
    }
}

最后再给大家推荐一门使用的前端课程:Web 前端工程师 P5-P6

如果你也有如下疑惑和烦恼

针对这些前端同学的共性问题,也为了帮助前端新手和初级工作者快速建立完整的知识体系,通过实战项目掌握前端面试的思路和技巧,最终拿到像阿里、字节跳动、腾讯、美团这样大厂的 offer 九章算法今年新开发了一门前端工程师培养课程。

不确定好不好,来免费**报名试听**就知道了。

723 次点击
所在节点    推广
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692600

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX