题目大意:
我们用一个特殊的字符串 S 来表示一份单词列表,之所以能展开成为一个列表,是因为这个字符串 S 中存在一个叫做「选项」的概念:
单词中的每个字母可能只有一个选项或存在多个备选项。如果只有一个选项,那么该字母按原样表示。
如果存在多个选项,就会以花括号包裹来表示这些选项(使它们与其他字母分隔开),例如 “{a,b,c}” 表示 [“a”, “b”, “c”]。
例子:”{a,b,c}d{e,f}” 可以表示单词列表 [“ade”, “adf”, “bde”, “bdf”, “cde”, “cdf”]。
请你按字典顺序,返回所有以这种方式形成的单词。
示例 1:
输入:"{a,b}c{d,e}f"
输出:["acdf","acef","bcdf","bcef"]示例 2:
输入:"abcd" 输出:["abcd"]
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1087
解题思路分析:
这道题我们需要先将字符分组,每个大括号内的字符属于同一组,括号外的字符都各自一组,分组之后,我们使用dfs搜索出所有路径,每条路径上所有字符的连线即是一个单词,dfs遍历完所有路径,也就相应的遍历完所有单词,最后再将单词排序一下即可。
实现代码:
List<String> res=new ArrayList<>(); // 返回结果
public String[] expand(String S) {
// 分组
List<List<Character>> list=new ArrayList<>();
// 先添加一个空的组,作为dfs起点
list.add(new ArrayList<>());
List<Character> current = new ArrayList<>();
boolean isInOption=false;
for(int i=0;i<S.length();i++){
char c = S.charAt(i);
if(c==',') continue;
if(c=='{'||c=='}') {
isInOption = c=='{';
list.add(current);
current=new ArrayList<>();
continue;
}
current.add(c);
if(!isInOption) {
list.add(current);
current=new ArrayList<>();
}
}
// dfs所有路径
dfs(list,0,"");
String[] arr=new String[res.size()];
for(int i=0;i<res.size();i++){
arr[i]=res.get(i);
}
Arrays.sort(arr);
return arr;
}
void dfs(List<List<Character>> list, int index, String s){
if(index==list.size()){
res.add(s);
return;
}
List<Character> charList=list.get(index);
if(charList.size()==0){
dfs(list,index+1,s);
return;
}
for(Character c : list.get(index)){
dfs(list,index+1,s+c);
}
}本题解法执行时间为3ms。
Runtime: 3 ms, faster than 84.12% of Java online submissions for Brace Expansion.
Memory Usage: 41.7 MB, less than 50.00% of Java online submissions for Brace Expansion.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1087-brace-expansion-解题思路分析/